{
  "nbformat": 4,
  "nbformat_minor": 0,
  "metadata": {
    "colab": {
      "name": "03_pytorch_computer_vision_exercise_solutions.ipynb",
      "provenance": [],
      "collapsed_sections": [],
      "authorship_tag": "ABX9TyOnW8A8G3kaKJ58HLc6IXYQ",
      "include_colab_link": true
    },
    "kernelspec": {
      "name": "python3",
      "display_name": "Python 3"
    },
    "language_info": {
      "name": "python"
    },
    "accelerator": "GPU",
    "widgets": {
      "application/vnd.jupyter.widget-state+json": {
        "f2fb9f5dfbe144caaeff6d95f3ea24b1": {
          "model_module": "@jupyter-widgets/controls",
          "model_name": "HBoxModel",
          "model_module_version": "1.5.0",
          "state": {
            "_dom_classes": [],
            "_model_module": "@jupyter-widgets/controls",
            "_model_module_version": "1.5.0",
            "_model_name": "HBoxModel",
            "_view_count": null,
            "_view_module": "@jupyter-widgets/controls",
            "_view_module_version": "1.5.0",
            "_view_name": "HBoxView",
            "box_style": "",
            "children": [
              "IPY_MODEL_bd43d96dea8f4ff2a71037d5c594845d",
              "IPY_MODEL_5171c1cc4aca4737b46b99ed9a7ab9da",
              "IPY_MODEL_00b8d54af39a4ba4bd9e488ecaa37772"
            ],
            "layout": "IPY_MODEL_49a6ff8d5ce347528577eb3896b425d9"
          }
        },
        "bd43d96dea8f4ff2a71037d5c594845d": {
          "model_module": "@jupyter-widgets/controls",
          "model_name": "HTMLModel",
          "model_module_version": "1.5.0",
          "state": {
            "_dom_classes": [],
            "_model_module": "@jupyter-widgets/controls",
            "_model_module_version": "1.5.0",
            "_model_name": "HTMLModel",
            "_view_count": null,
            "_view_module": "@jupyter-widgets/controls",
            "_view_module_version": "1.5.0",
            "_view_name": "HTMLView",
            "description": "",
            "description_tooltip": null,
            "layout": "IPY_MODEL_9fbb80c57c814ab6bf0205ba1b1a71e9",
            "placeholder": "​",
            "style": "IPY_MODEL_4cc05625e0834781b9f65bd31d2f5fb0",
            "value": "100%"
          }
        },
        "5171c1cc4aca4737b46b99ed9a7ab9da": {
          "model_module": "@jupyter-widgets/controls",
          "model_name": "FloatProgressModel",
          "model_module_version": "1.5.0",
          "state": {
            "_dom_classes": [],
            "_model_module": "@jupyter-widgets/controls",
            "_model_module_version": "1.5.0",
            "_model_name": "FloatProgressModel",
            "_view_count": null,
            "_view_module": "@jupyter-widgets/controls",
            "_view_module_version": "1.5.0",
            "_view_name": "ProgressView",
            "bar_style": "success",
            "description": "",
            "description_tooltip": null,
            "layout": "IPY_MODEL_faa2697a0c274661886e031ab42e0a04",
            "max": 5,
            "min": 0,
            "orientation": "horizontal",
            "style": "IPY_MODEL_9cec1b0eee41441899c4d7fb743fa33e",
            "value": 5
          }
        },
        "00b8d54af39a4ba4bd9e488ecaa37772": {
          "model_module": "@jupyter-widgets/controls",
          "model_name": "HTMLModel",
          "model_module_version": "1.5.0",
          "state": {
            "_dom_classes": [],
            "_model_module": "@jupyter-widgets/controls",
            "_model_module_version": "1.5.0",
            "_model_name": "HTMLModel",
            "_view_count": null,
            "_view_module": "@jupyter-widgets/controls",
            "_view_module_version": "1.5.0",
            "_view_name": "HTMLView",
            "description": "",
            "description_tooltip": null,
            "layout": "IPY_MODEL_3aa64a1f9a4f4f38b710d2a28b26c19f",
            "placeholder": "​",
            "style": "IPY_MODEL_a35d16d75b5b4f27b26828af2154a3d5",
            "value": " 5/5 [03:28&lt;00:00, 41.05s/it]"
          }
        },
        "49a6ff8d5ce347528577eb3896b425d9": {
          "model_module": "@jupyter-widgets/base",
          "model_name": "LayoutModel",
          "model_module_version": "1.2.0",
          "state": {
            "_model_module": "@jupyter-widgets/base",
            "_model_module_version": "1.2.0",
            "_model_name": "LayoutModel",
            "_view_count": null,
            "_view_module": "@jupyter-widgets/base",
            "_view_module_version": "1.2.0",
            "_view_name": "LayoutView",
            "align_content": null,
            "align_items": null,
            "align_self": null,
            "border": null,
            "bottom": null,
            "display": null,
            "flex": null,
            "flex_flow": null,
            "grid_area": null,
            "grid_auto_columns": null,
            "grid_auto_flow": null,
            "grid_auto_rows": null,
            "grid_column": null,
            "grid_gap": null,
            "grid_row": null,
            "grid_template_areas": null,
            "grid_template_columns": null,
            "grid_template_rows": null,
            "height": null,
            "justify_content": null,
            "justify_items": null,
            "left": null,
            "margin": null,
            "max_height": null,
            "max_width": null,
            "min_height": null,
            "min_width": null,
            "object_fit": null,
            "object_position": null,
            "order": null,
            "overflow": null,
            "overflow_x": null,
            "overflow_y": null,
            "padding": null,
            "right": null,
            "top": null,
            "visibility": null,
            "width": null
          }
        },
        "9fbb80c57c814ab6bf0205ba1b1a71e9": {
          "model_module": "@jupyter-widgets/base",
          "model_name": "LayoutModel",
          "model_module_version": "1.2.0",
          "state": {
            "_model_module": "@jupyter-widgets/base",
            "_model_module_version": "1.2.0",
            "_model_name": "LayoutModel",
            "_view_count": null,
            "_view_module": "@jupyter-widgets/base",
            "_view_module_version": "1.2.0",
            "_view_name": "LayoutView",
            "align_content": null,
            "align_items": null,
            "align_self": null,
            "border": null,
            "bottom": null,
            "display": null,
            "flex": null,
            "flex_flow": null,
            "grid_area": null,
            "grid_auto_columns": null,
            "grid_auto_flow": null,
            "grid_auto_rows": null,
            "grid_column": null,
            "grid_gap": null,
            "grid_row": null,
            "grid_template_areas": null,
            "grid_template_columns": null,
            "grid_template_rows": null,
            "height": null,
            "justify_content": null,
            "justify_items": null,
            "left": null,
            "margin": null,
            "max_height": null,
            "max_width": null,
            "min_height": null,
            "min_width": null,
            "object_fit": null,
            "object_position": null,
            "order": null,
            "overflow": null,
            "overflow_x": null,
            "overflow_y": null,
            "padding": null,
            "right": null,
            "top": null,
            "visibility": null,
            "width": null
          }
        },
        "4cc05625e0834781b9f65bd31d2f5fb0": {
          "model_module": "@jupyter-widgets/controls",
          "model_name": "DescriptionStyleModel",
          "model_module_version": "1.5.0",
          "state": {
            "_model_module": "@jupyter-widgets/controls",
            "_model_module_version": "1.5.0",
            "_model_name": "DescriptionStyleModel",
            "_view_count": null,
            "_view_module": "@jupyter-widgets/base",
            "_view_module_version": "1.2.0",
            "_view_name": "StyleView",
            "description_width": ""
          }
        },
        "faa2697a0c274661886e031ab42e0a04": {
          "model_module": "@jupyter-widgets/base",
          "model_name": "LayoutModel",
          "model_module_version": "1.2.0",
          "state": {
            "_model_module": "@jupyter-widgets/base",
            "_model_module_version": "1.2.0",
            "_model_name": "LayoutModel",
            "_view_count": null,
            "_view_module": "@jupyter-widgets/base",
            "_view_module_version": "1.2.0",
            "_view_name": "LayoutView",
            "align_content": null,
            "align_items": null,
            "align_self": null,
            "border": null,
            "bottom": null,
            "display": null,
            "flex": null,
            "flex_flow": null,
            "grid_area": null,
            "grid_auto_columns": null,
            "grid_auto_flow": null,
            "grid_auto_rows": null,
            "grid_column": null,
            "grid_gap": null,
            "grid_row": null,
            "grid_template_areas": null,
            "grid_template_columns": null,
            "grid_template_rows": null,
            "height": null,
            "justify_content": null,
            "justify_items": null,
            "left": null,
            "margin": null,
            "max_height": null,
            "max_width": null,
            "min_height": null,
            "min_width": null,
            "object_fit": null,
            "object_position": null,
            "order": null,
            "overflow": null,
            "overflow_x": null,
            "overflow_y": null,
            "padding": null,
            "right": null,
            "top": null,
            "visibility": null,
            "width": null
          }
        },
        "9cec1b0eee41441899c4d7fb743fa33e": {
          "model_module": "@jupyter-widgets/controls",
          "model_name": "ProgressStyleModel",
          "model_module_version": "1.5.0",
          "state": {
            "_model_module": "@jupyter-widgets/controls",
            "_model_module_version": "1.5.0",
            "_model_name": "ProgressStyleModel",
            "_view_count": null,
            "_view_module": "@jupyter-widgets/base",
            "_view_module_version": "1.2.0",
            "_view_name": "StyleView",
            "bar_color": null,
            "description_width": ""
          }
        },
        "3aa64a1f9a4f4f38b710d2a28b26c19f": {
          "model_module": "@jupyter-widgets/base",
          "model_name": "LayoutModel",
          "model_module_version": "1.2.0",
          "state": {
            "_model_module": "@jupyter-widgets/base",
            "_model_module_version": "1.2.0",
            "_model_name": "LayoutModel",
            "_view_count": null,
            "_view_module": "@jupyter-widgets/base",
            "_view_module_version": "1.2.0",
            "_view_name": "LayoutView",
            "align_content": null,
            "align_items": null,
            "align_self": null,
            "border": null,
            "bottom": null,
            "display": null,
            "flex": null,
            "flex_flow": null,
            "grid_area": null,
            "grid_auto_columns": null,
            "grid_auto_flow": null,
            "grid_auto_rows": null,
            "grid_column": null,
            "grid_gap": null,
            "grid_row": null,
            "grid_template_areas": null,
            "grid_template_columns": null,
            "grid_template_rows": null,
            "height": null,
            "justify_content": null,
            "justify_items": null,
            "left": null,
            "margin": null,
            "max_height": null,
            "max_width": null,
            "min_height": null,
            "min_width": null,
            "object_fit": null,
            "object_position": null,
            "order": null,
            "overflow": null,
            "overflow_x": null,
            "overflow_y": null,
            "padding": null,
            "right": null,
            "top": null,
            "visibility": null,
            "width": null
          }
        },
        "a35d16d75b5b4f27b26828af2154a3d5": {
          "model_module": "@jupyter-widgets/controls",
          "model_name": "DescriptionStyleModel",
          "model_module_version": "1.5.0",
          "state": {
            "_model_module": "@jupyter-widgets/controls",
            "_model_module_version": "1.5.0",
            "_model_name": "DescriptionStyleModel",
            "_view_count": null,
            "_view_module": "@jupyter-widgets/base",
            "_view_module_version": "1.2.0",
            "_view_name": "StyleView",
            "description_width": ""
          }
        },
        "ac4f9033337a425ab05f963a300af10a": {
          "model_module": "@jupyter-widgets/controls",
          "model_name": "HBoxModel",
          "model_module_version": "1.5.0",
          "state": {
            "_dom_classes": [],
            "_model_module": "@jupyter-widgets/controls",
            "_model_module_version": "1.5.0",
            "_model_name": "HBoxModel",
            "_view_count": null,
            "_view_module": "@jupyter-widgets/controls",
            "_view_module_version": "1.5.0",
            "_view_name": "HBoxView",
            "box_style": "",
            "children": [
              "IPY_MODEL_4c2b4be7117d4043b56d6b4e05251d9e",
              "IPY_MODEL_800977f38e5e45f9bb7b8f43fe78ea9c",
              "IPY_MODEL_2f37f541c8f949eab60200d46fbc8b05"
            ],
            "layout": "IPY_MODEL_8695077763e749559af9cec55f651006"
          }
        },
        "4c2b4be7117d4043b56d6b4e05251d9e": {
          "model_module": "@jupyter-widgets/controls",
          "model_name": "HTMLModel",
          "model_module_version": "1.5.0",
          "state": {
            "_dom_classes": [],
            "_model_module": "@jupyter-widgets/controls",
            "_model_module_version": "1.5.0",
            "_model_name": "HTMLModel",
            "_view_count": null,
            "_view_module": "@jupyter-widgets/controls",
            "_view_module_version": "1.5.0",
            "_view_name": "HTMLView",
            "description": "",
            "description_tooltip": null,
            "layout": "IPY_MODEL_1853564527f045d7bcb510f62b45489f",
            "placeholder": "​",
            "style": "IPY_MODEL_adf4f0bbf7d44ae3a13b627bd754e421",
            "value": "100%"
          }
        },
        "800977f38e5e45f9bb7b8f43fe78ea9c": {
          "model_module": "@jupyter-widgets/controls",
          "model_name": "FloatProgressModel",
          "model_module_version": "1.5.0",
          "state": {
            "_dom_classes": [],
            "_model_module": "@jupyter-widgets/controls",
            "_model_module_version": "1.5.0",
            "_model_name": "FloatProgressModel",
            "_view_count": null,
            "_view_module": "@jupyter-widgets/controls",
            "_view_module_version": "1.5.0",
            "_view_name": "ProgressView",
            "bar_style": "success",
            "description": "",
            "description_tooltip": null,
            "layout": "IPY_MODEL_3913cd7ccbfa4fa29305a7a34c0a6846",
            "max": 5,
            "min": 0,
            "orientation": "horizontal",
            "style": "IPY_MODEL_61814ca3a0704d0d84cededc512f96a4",
            "value": 5
          }
        },
        "2f37f541c8f949eab60200d46fbc8b05": {
          "model_module": "@jupyter-widgets/controls",
          "model_name": "HTMLModel",
          "model_module_version": "1.5.0",
          "state": {
            "_dom_classes": [],
            "_model_module": "@jupyter-widgets/controls",
            "_model_module_version": "1.5.0",
            "_model_name": "HTMLModel",
            "_view_count": null,
            "_view_module": "@jupyter-widgets/controls",
            "_view_module_version": "1.5.0",
            "_view_name": "HTMLView",
            "description": "",
            "description_tooltip": null,
            "layout": "IPY_MODEL_17ba6b57f29a42f9a525db0bbe3bdb68",
            "placeholder": "​",
            "style": "IPY_MODEL_d29972a957884ef0bf2d4ac167eb2218",
            "value": " 5/5 [00:43&lt;00:00,  8.76s/it]"
          }
        },
        "8695077763e749559af9cec55f651006": {
          "model_module": "@jupyter-widgets/base",
          "model_name": "LayoutModel",
          "model_module_version": "1.2.0",
          "state": {
            "_model_module": "@jupyter-widgets/base",
            "_model_module_version": "1.2.0",
            "_model_name": "LayoutModel",
            "_view_count": null,
            "_view_module": "@jupyter-widgets/base",
            "_view_module_version": "1.2.0",
            "_view_name": "LayoutView",
            "align_content": null,
            "align_items": null,
            "align_self": null,
            "border": null,
            "bottom": null,
            "display": null,
            "flex": null,
            "flex_flow": null,
            "grid_area": null,
            "grid_auto_columns": null,
            "grid_auto_flow": null,
            "grid_auto_rows": null,
            "grid_column": null,
            "grid_gap": null,
            "grid_row": null,
            "grid_template_areas": null,
            "grid_template_columns": null,
            "grid_template_rows": null,
            "height": null,
            "justify_content": null,
            "justify_items": null,
            "left": null,
            "margin": null,
            "max_height": null,
            "max_width": null,
            "min_height": null,
            "min_width": null,
            "object_fit": null,
            "object_position": null,
            "order": null,
            "overflow": null,
            "overflow_x": null,
            "overflow_y": null,
            "padding": null,
            "right": null,
            "top": null,
            "visibility": null,
            "width": null
          }
        },
        "1853564527f045d7bcb510f62b45489f": {
          "model_module": "@jupyter-widgets/base",
          "model_name": "LayoutModel",
          "model_module_version": "1.2.0",
          "state": {
            "_model_module": "@jupyter-widgets/base",
            "_model_module_version": "1.2.0",
            "_model_name": "LayoutModel",
            "_view_count": null,
            "_view_module": "@jupyter-widgets/base",
            "_view_module_version": "1.2.0",
            "_view_name": "LayoutView",
            "align_content": null,
            "align_items": null,
            "align_self": null,
            "border": null,
            "bottom": null,
            "display": null,
            "flex": null,
            "flex_flow": null,
            "grid_area": null,
            "grid_auto_columns": null,
            "grid_auto_flow": null,
            "grid_auto_rows": null,
            "grid_column": null,
            "grid_gap": null,
            "grid_row": null,
            "grid_template_areas": null,
            "grid_template_columns": null,
            "grid_template_rows": null,
            "height": null,
            "justify_content": null,
            "justify_items": null,
            "left": null,
            "margin": null,
            "max_height": null,
            "max_width": null,
            "min_height": null,
            "min_width": null,
            "object_fit": null,
            "object_position": null,
            "order": null,
            "overflow": null,
            "overflow_x": null,
            "overflow_y": null,
            "padding": null,
            "right": null,
            "top": null,
            "visibility": null,
            "width": null
          }
        },
        "adf4f0bbf7d44ae3a13b627bd754e421": {
          "model_module": "@jupyter-widgets/controls",
          "model_name": "DescriptionStyleModel",
          "model_module_version": "1.5.0",
          "state": {
            "_model_module": "@jupyter-widgets/controls",
            "_model_module_version": "1.5.0",
            "_model_name": "DescriptionStyleModel",
            "_view_count": null,
            "_view_module": "@jupyter-widgets/base",
            "_view_module_version": "1.2.0",
            "_view_name": "StyleView",
            "description_width": ""
          }
        },
        "3913cd7ccbfa4fa29305a7a34c0a6846": {
          "model_module": "@jupyter-widgets/base",
          "model_name": "LayoutModel",
          "model_module_version": "1.2.0",
          "state": {
            "_model_module": "@jupyter-widgets/base",
            "_model_module_version": "1.2.0",
            "_model_name": "LayoutModel",
            "_view_count": null,
            "_view_module": "@jupyter-widgets/base",
            "_view_module_version": "1.2.0",
            "_view_name": "LayoutView",
            "align_content": null,
            "align_items": null,
            "align_self": null,
            "border": null,
            "bottom": null,
            "display": null,
            "flex": null,
            "flex_flow": null,
            "grid_area": null,
            "grid_auto_columns": null,
            "grid_auto_flow": null,
            "grid_auto_rows": null,
            "grid_column": null,
            "grid_gap": null,
            "grid_row": null,
            "grid_template_areas": null,
            "grid_template_columns": null,
            "grid_template_rows": null,
            "height": null,
            "justify_content": null,
            "justify_items": null,
            "left": null,
            "margin": null,
            "max_height": null,
            "max_width": null,
            "min_height": null,
            "min_width": null,
            "object_fit": null,
            "object_position": null,
            "order": null,
            "overflow": null,
            "overflow_x": null,
            "overflow_y": null,
            "padding": null,
            "right": null,
            "top": null,
            "visibility": null,
            "width": null
          }
        },
        "61814ca3a0704d0d84cededc512f96a4": {
          "model_module": "@jupyter-widgets/controls",
          "model_name": "ProgressStyleModel",
          "model_module_version": "1.5.0",
          "state": {
            "_model_module": "@jupyter-widgets/controls",
            "_model_module_version": "1.5.0",
            "_model_name": "ProgressStyleModel",
            "_view_count": null,
            "_view_module": "@jupyter-widgets/base",
            "_view_module_version": "1.2.0",
            "_view_name": "StyleView",
            "bar_color": null,
            "description_width": ""
          }
        },
        "17ba6b57f29a42f9a525db0bbe3bdb68": {
          "model_module": "@jupyter-widgets/base",
          "model_name": "LayoutModel",
          "model_module_version": "1.2.0",
          "state": {
            "_model_module": "@jupyter-widgets/base",
            "_model_module_version": "1.2.0",
            "_model_name": "LayoutModel",
            "_view_count": null,
            "_view_module": "@jupyter-widgets/base",
            "_view_module_version": "1.2.0",
            "_view_name": "LayoutView",
            "align_content": null,
            "align_items": null,
            "align_self": null,
            "border": null,
            "bottom": null,
            "display": null,
            "flex": null,
            "flex_flow": null,
            "grid_area": null,
            "grid_auto_columns": null,
            "grid_auto_flow": null,
            "grid_auto_rows": null,
            "grid_column": null,
            "grid_gap": null,
            "grid_row": null,
            "grid_template_areas": null,
            "grid_template_columns": null,
            "grid_template_rows": null,
            "height": null,
            "justify_content": null,
            "justify_items": null,
            "left": null,
            "margin": null,
            "max_height": null,
            "max_width": null,
            "min_height": null,
            "min_width": null,
            "object_fit": null,
            "object_position": null,
            "order": null,
            "overflow": null,
            "overflow_x": null,
            "overflow_y": null,
            "padding": null,
            "right": null,
            "top": null,
            "visibility": null,
            "width": null
          }
        },
        "d29972a957884ef0bf2d4ac167eb2218": {
          "model_module": "@jupyter-widgets/controls",
          "model_name": "DescriptionStyleModel",
          "model_module_version": "1.5.0",
          "state": {
            "_model_module": "@jupyter-widgets/controls",
            "_model_module_version": "1.5.0",
            "_model_name": "DescriptionStyleModel",
            "_view_count": null,
            "_view_module": "@jupyter-widgets/base",
            "_view_module_version": "1.2.0",
            "_view_name": "StyleView",
            "description_width": ""
          }
        },
        "fd9be8a0ee5244fa833009d0c531a643": {
          "model_module": "@jupyter-widgets/controls",
          "model_name": "HBoxModel",
          "model_module_version": "1.5.0",
          "state": {
            "_dom_classes": [],
            "_model_module": "@jupyter-widgets/controls",
            "_model_module_version": "1.5.0",
            "_model_name": "HBoxModel",
            "_view_count": null,
            "_view_module": "@jupyter-widgets/controls",
            "_view_module_version": "1.5.0",
            "_view_name": "HBoxView",
            "box_style": "",
            "children": [
              "IPY_MODEL_59a28ded11914e88a8d54c8bac21e3a4",
              "IPY_MODEL_6fb3df7d7bec4e92abdf872d4cc50f9c",
              "IPY_MODEL_194f0886026b47b4bc1855151ad97034"
            ],
            "layout": "IPY_MODEL_b5931a6b638d408f93255db7cd0283bf"
          }
        },
        "59a28ded11914e88a8d54c8bac21e3a4": {
          "model_module": "@jupyter-widgets/controls",
          "model_name": "HTMLModel",
          "model_module_version": "1.5.0",
          "state": {
            "_dom_classes": [],
            "_model_module": "@jupyter-widgets/controls",
            "_model_module_version": "1.5.0",
            "_model_name": "HTMLModel",
            "_view_count": null,
            "_view_module": "@jupyter-widgets/controls",
            "_view_module_version": "1.5.0",
            "_view_name": "HTMLView",
            "description": "",
            "description_tooltip": null,
            "layout": "IPY_MODEL_11278b21b19f4ec4b163313b42a7c9ef",
            "placeholder": "​",
            "style": "IPY_MODEL_4bea2e3d735e4c569fc5026bf0e36b9b",
            "value": ""
          }
        },
        "6fb3df7d7bec4e92abdf872d4cc50f9c": {
          "model_module": "@jupyter-widgets/controls",
          "model_name": "FloatProgressModel",
          "model_module_version": "1.5.0",
          "state": {
            "_dom_classes": [],
            "_model_module": "@jupyter-widgets/controls",
            "_model_module_version": "1.5.0",
            "_model_name": "FloatProgressModel",
            "_view_count": null,
            "_view_module": "@jupyter-widgets/controls",
            "_view_module_version": "1.5.0",
            "_view_name": "ProgressView",
            "bar_style": "success",
            "description": "",
            "description_tooltip": null,
            "layout": "IPY_MODEL_f219941b11dd42afba6e5d9fb9be7c4b",
            "max": 1,
            "min": 0,
            "orientation": "horizontal",
            "style": "IPY_MODEL_829d30f9c02f46358bcc78768fabc3c5",
            "value": 1
          }
        },
        "194f0886026b47b4bc1855151ad97034": {
          "model_module": "@jupyter-widgets/controls",
          "model_name": "HTMLModel",
          "model_module_version": "1.5.0",
          "state": {
            "_dom_classes": [],
            "_model_module": "@jupyter-widgets/controls",
            "_model_module_version": "1.5.0",
            "_model_name": "HTMLModel",
            "_view_count": null,
            "_view_module": "@jupyter-widgets/controls",
            "_view_module_version": "1.5.0",
            "_view_name": "HTMLView",
            "description": "",
            "description_tooltip": null,
            "layout": "IPY_MODEL_2e97b9ce8eca4a4d8d1b68a5c19fbe11",
            "placeholder": "​",
            "style": "IPY_MODEL_14ae9f7185124afcab1ca2e38ecbd81b",
            "value": " 313/? [00:01&lt;00:00, 322.62it/s]"
          }
        },
        "b5931a6b638d408f93255db7cd0283bf": {
          "model_module": "@jupyter-widgets/base",
          "model_name": "LayoutModel",
          "model_module_version": "1.2.0",
          "state": {
            "_model_module": "@jupyter-widgets/base",
            "_model_module_version": "1.2.0",
            "_model_name": "LayoutModel",
            "_view_count": null,
            "_view_module": "@jupyter-widgets/base",
            "_view_module_version": "1.2.0",
            "_view_name": "LayoutView",
            "align_content": null,
            "align_items": null,
            "align_self": null,
            "border": null,
            "bottom": null,
            "display": null,
            "flex": null,
            "flex_flow": null,
            "grid_area": null,
            "grid_auto_columns": null,
            "grid_auto_flow": null,
            "grid_auto_rows": null,
            "grid_column": null,
            "grid_gap": null,
            "grid_row": null,
            "grid_template_areas": null,
            "grid_template_columns": null,
            "grid_template_rows": null,
            "height": null,
            "justify_content": null,
            "justify_items": null,
            "left": null,
            "margin": null,
            "max_height": null,
            "max_width": null,
            "min_height": null,
            "min_width": null,
            "object_fit": null,
            "object_position": null,
            "order": null,
            "overflow": null,
            "overflow_x": null,
            "overflow_y": null,
            "padding": null,
            "right": null,
            "top": null,
            "visibility": null,
            "width": null
          }
        },
        "11278b21b19f4ec4b163313b42a7c9ef": {
          "model_module": "@jupyter-widgets/base",
          "model_name": "LayoutModel",
          "model_module_version": "1.2.0",
          "state": {
            "_model_module": "@jupyter-widgets/base",
            "_model_module_version": "1.2.0",
            "_model_name": "LayoutModel",
            "_view_count": null,
            "_view_module": "@jupyter-widgets/base",
            "_view_module_version": "1.2.0",
            "_view_name": "LayoutView",
            "align_content": null,
            "align_items": null,
            "align_self": null,
            "border": null,
            "bottom": null,
            "display": null,
            "flex": null,
            "flex_flow": null,
            "grid_area": null,
            "grid_auto_columns": null,
            "grid_auto_flow": null,
            "grid_auto_rows": null,
            "grid_column": null,
            "grid_gap": null,
            "grid_row": null,
            "grid_template_areas": null,
            "grid_template_columns": null,
            "grid_template_rows": null,
            "height": null,
            "justify_content": null,
            "justify_items": null,
            "left": null,
            "margin": null,
            "max_height": null,
            "max_width": null,
            "min_height": null,
            "min_width": null,
            "object_fit": null,
            "object_position": null,
            "order": null,
            "overflow": null,
            "overflow_x": null,
            "overflow_y": null,
            "padding": null,
            "right": null,
            "top": null,
            "visibility": null,
            "width": null
          }
        },
        "4bea2e3d735e4c569fc5026bf0e36b9b": {
          "model_module": "@jupyter-widgets/controls",
          "model_name": "DescriptionStyleModel",
          "model_module_version": "1.5.0",
          "state": {
            "_model_module": "@jupyter-widgets/controls",
            "_model_module_version": "1.5.0",
            "_model_name": "DescriptionStyleModel",
            "_view_count": null,
            "_view_module": "@jupyter-widgets/base",
            "_view_module_version": "1.2.0",
            "_view_name": "StyleView",
            "description_width": ""
          }
        },
        "f219941b11dd42afba6e5d9fb9be7c4b": {
          "model_module": "@jupyter-widgets/base",
          "model_name": "LayoutModel",
          "model_module_version": "1.2.0",
          "state": {
            "_model_module": "@jupyter-widgets/base",
            "_model_module_version": "1.2.0",
            "_model_name": "LayoutModel",
            "_view_count": null,
            "_view_module": "@jupyter-widgets/base",
            "_view_module_version": "1.2.0",
            "_view_name": "LayoutView",
            "align_content": null,
            "align_items": null,
            "align_self": null,
            "border": null,
            "bottom": null,
            "display": null,
            "flex": null,
            "flex_flow": null,
            "grid_area": null,
            "grid_auto_columns": null,
            "grid_auto_flow": null,
            "grid_auto_rows": null,
            "grid_column": null,
            "grid_gap": null,
            "grid_row": null,
            "grid_template_areas": null,
            "grid_template_columns": null,
            "grid_template_rows": null,
            "height": null,
            "justify_content": null,
            "justify_items": null,
            "left": null,
            "margin": null,
            "max_height": null,
            "max_width": null,
            "min_height": null,
            "min_width": null,
            "object_fit": null,
            "object_position": null,
            "order": null,
            "overflow": null,
            "overflow_x": null,
            "overflow_y": null,
            "padding": null,
            "right": null,
            "top": null,
            "visibility": null,
            "width": "20px"
          }
        },
        "829d30f9c02f46358bcc78768fabc3c5": {
          "model_module": "@jupyter-widgets/controls",
          "model_name": "ProgressStyleModel",
          "model_module_version": "1.5.0",
          "state": {
            "_model_module": "@jupyter-widgets/controls",
            "_model_module_version": "1.5.0",
            "_model_name": "ProgressStyleModel",
            "_view_count": null,
            "_view_module": "@jupyter-widgets/base",
            "_view_module_version": "1.2.0",
            "_view_name": "StyleView",
            "bar_color": null,
            "description_width": ""
          }
        },
        "2e97b9ce8eca4a4d8d1b68a5c19fbe11": {
          "model_module": "@jupyter-widgets/base",
          "model_name": "LayoutModel",
          "model_module_version": "1.2.0",
          "state": {
            "_model_module": "@jupyter-widgets/base",
            "_model_module_version": "1.2.0",
            "_model_name": "LayoutModel",
            "_view_count": null,
            "_view_module": "@jupyter-widgets/base",
            "_view_module_version": "1.2.0",
            "_view_name": "LayoutView",
            "align_content": null,
            "align_items": null,
            "align_self": null,
            "border": null,
            "bottom": null,
            "display": null,
            "flex": null,
            "flex_flow": null,
            "grid_area": null,
            "grid_auto_columns": null,
            "grid_auto_flow": null,
            "grid_auto_rows": null,
            "grid_column": null,
            "grid_gap": null,
            "grid_row": null,
            "grid_template_areas": null,
            "grid_template_columns": null,
            "grid_template_rows": null,
            "height": null,
            "justify_content": null,
            "justify_items": null,
            "left": null,
            "margin": null,
            "max_height": null,
            "max_width": null,
            "min_height": null,
            "min_width": null,
            "object_fit": null,
            "object_position": null,
            "order": null,
            "overflow": null,
            "overflow_x": null,
            "overflow_y": null,
            "padding": null,
            "right": null,
            "top": null,
            "visibility": null,
            "width": null
          }
        },
        "14ae9f7185124afcab1ca2e38ecbd81b": {
          "model_module": "@jupyter-widgets/controls",
          "model_name": "DescriptionStyleModel",
          "model_module_version": "1.5.0",
          "state": {
            "_model_module": "@jupyter-widgets/controls",
            "_model_module_version": "1.5.0",
            "_model_name": "DescriptionStyleModel",
            "_view_count": null,
            "_view_module": "@jupyter-widgets/base",
            "_view_module_version": "1.2.0",
            "_view_name": "StyleView",
            "description_width": ""
          }
        },
        "a74d331cd4b24285a55e5a3705f1b68f": {
          "model_module": "@jupyter-widgets/controls",
          "model_name": "HBoxModel",
          "model_module_version": "1.5.0",
          "state": {
            "_dom_classes": [],
            "_model_module": "@jupyter-widgets/controls",
            "_model_module_version": "1.5.0",
            "_model_name": "HBoxModel",
            "_view_count": null,
            "_view_module": "@jupyter-widgets/controls",
            "_view_module_version": "1.5.0",
            "_view_name": "HBoxView",
            "box_style": "",
            "children": [
              "IPY_MODEL_e24d41fab6ee49e09997503870813e0a",
              "IPY_MODEL_561e8d9c749b4be0a126db44e263145b",
              "IPY_MODEL_8241d895e996490f9e40f2393f3ee7f9"
            ],
            "layout": "IPY_MODEL_f9b11b9712c3423784642b7a3597e667"
          }
        },
        "e24d41fab6ee49e09997503870813e0a": {
          "model_module": "@jupyter-widgets/controls",
          "model_name": "HTMLModel",
          "model_module_version": "1.5.0",
          "state": {
            "_dom_classes": [],
            "_model_module": "@jupyter-widgets/controls",
            "_model_module_version": "1.5.0",
            "_model_name": "HTMLModel",
            "_view_count": null,
            "_view_module": "@jupyter-widgets/controls",
            "_view_module_version": "1.5.0",
            "_view_name": "HTMLView",
            "description": "",
            "description_tooltip": null,
            "layout": "IPY_MODEL_c9b96de5d3b94ed8ae22a956ba81ed23",
            "placeholder": "​",
            "style": "IPY_MODEL_1a802f281ef24b9ca5949ff3106b88ef",
            "value": "100%"
          }
        },
        "561e8d9c749b4be0a126db44e263145b": {
          "model_module": "@jupyter-widgets/controls",
          "model_name": "FloatProgressModel",
          "model_module_version": "1.5.0",
          "state": {
            "_dom_classes": [],
            "_model_module": "@jupyter-widgets/controls",
            "_model_module_version": "1.5.0",
            "_model_name": "FloatProgressModel",
            "_view_count": null,
            "_view_module": "@jupyter-widgets/controls",
            "_view_module_version": "1.5.0",
            "_view_name": "ProgressView",
            "bar_style": "success",
            "description": "",
            "description_tooltip": null,
            "layout": "IPY_MODEL_d082717fb8e94afe8a3c129c9b57d3ce",
            "max": 5,
            "min": 0,
            "orientation": "horizontal",
            "style": "IPY_MODEL_ed1fe3209f9440a38bcfa77b89f5c8ad",
            "value": 5
          }
        },
        "8241d895e996490f9e40f2393f3ee7f9": {
          "model_module": "@jupyter-widgets/controls",
          "model_name": "HTMLModel",
          "model_module_version": "1.5.0",
          "state": {
            "_dom_classes": [],
            "_model_module": "@jupyter-widgets/controls",
            "_model_module_version": "1.5.0",
            "_model_name": "HTMLModel",
            "_view_count": null,
            "_view_module": "@jupyter-widgets/controls",
            "_view_module_version": "1.5.0",
            "_view_name": "HTMLView",
            "description": "",
            "description_tooltip": null,
            "layout": "IPY_MODEL_430e20b56d344c1d9942e4b50b77be77",
            "placeholder": "​",
            "style": "IPY_MODEL_c7374c0a769a4dac96ace3670e6800e4",
            "value": " 5/5 [01:14&lt;00:00, 14.37s/it]"
          }
        },
        "f9b11b9712c3423784642b7a3597e667": {
          "model_module": "@jupyter-widgets/base",
          "model_name": "LayoutModel",
          "model_module_version": "1.2.0",
          "state": {
            "_model_module": "@jupyter-widgets/base",
            "_model_module_version": "1.2.0",
            "_model_name": "LayoutModel",
            "_view_count": null,
            "_view_module": "@jupyter-widgets/base",
            "_view_module_version": "1.2.0",
            "_view_name": "LayoutView",
            "align_content": null,
            "align_items": null,
            "align_self": null,
            "border": null,
            "bottom": null,
            "display": null,
            "flex": null,
            "flex_flow": null,
            "grid_area": null,
            "grid_auto_columns": null,
            "grid_auto_flow": null,
            "grid_auto_rows": null,
            "grid_column": null,
            "grid_gap": null,
            "grid_row": null,
            "grid_template_areas": null,
            "grid_template_columns": null,
            "grid_template_rows": null,
            "height": null,
            "justify_content": null,
            "justify_items": null,
            "left": null,
            "margin": null,
            "max_height": null,
            "max_width": null,
            "min_height": null,
            "min_width": null,
            "object_fit": null,
            "object_position": null,
            "order": null,
            "overflow": null,
            "overflow_x": null,
            "overflow_y": null,
            "padding": null,
            "right": null,
            "top": null,
            "visibility": null,
            "width": null
          }
        },
        "c9b96de5d3b94ed8ae22a956ba81ed23": {
          "model_module": "@jupyter-widgets/base",
          "model_name": "LayoutModel",
          "model_module_version": "1.2.0",
          "state": {
            "_model_module": "@jupyter-widgets/base",
            "_model_module_version": "1.2.0",
            "_model_name": "LayoutModel",
            "_view_count": null,
            "_view_module": "@jupyter-widgets/base",
            "_view_module_version": "1.2.0",
            "_view_name": "LayoutView",
            "align_content": null,
            "align_items": null,
            "align_self": null,
            "border": null,
            "bottom": null,
            "display": null,
            "flex": null,
            "flex_flow": null,
            "grid_area": null,
            "grid_auto_columns": null,
            "grid_auto_flow": null,
            "grid_auto_rows": null,
            "grid_column": null,
            "grid_gap": null,
            "grid_row": null,
            "grid_template_areas": null,
            "grid_template_columns": null,
            "grid_template_rows": null,
            "height": null,
            "justify_content": null,
            "justify_items": null,
            "left": null,
            "margin": null,
            "max_height": null,
            "max_width": null,
            "min_height": null,
            "min_width": null,
            "object_fit": null,
            "object_position": null,
            "order": null,
            "overflow": null,
            "overflow_x": null,
            "overflow_y": null,
            "padding": null,
            "right": null,
            "top": null,
            "visibility": null,
            "width": null
          }
        },
        "1a802f281ef24b9ca5949ff3106b88ef": {
          "model_module": "@jupyter-widgets/controls",
          "model_name": "DescriptionStyleModel",
          "model_module_version": "1.5.0",
          "state": {
            "_model_module": "@jupyter-widgets/controls",
            "_model_module_version": "1.5.0",
            "_model_name": "DescriptionStyleModel",
            "_view_count": null,
            "_view_module": "@jupyter-widgets/base",
            "_view_module_version": "1.2.0",
            "_view_name": "StyleView",
            "description_width": ""
          }
        },
        "d082717fb8e94afe8a3c129c9b57d3ce": {
          "model_module": "@jupyter-widgets/base",
          "model_name": "LayoutModel",
          "model_module_version": "1.2.0",
          "state": {
            "_model_module": "@jupyter-widgets/base",
            "_model_module_version": "1.2.0",
            "_model_name": "LayoutModel",
            "_view_count": null,
            "_view_module": "@jupyter-widgets/base",
            "_view_module_version": "1.2.0",
            "_view_name": "LayoutView",
            "align_content": null,
            "align_items": null,
            "align_self": null,
            "border": null,
            "bottom": null,
            "display": null,
            "flex": null,
            "flex_flow": null,
            "grid_area": null,
            "grid_auto_columns": null,
            "grid_auto_flow": null,
            "grid_auto_rows": null,
            "grid_column": null,
            "grid_gap": null,
            "grid_row": null,
            "grid_template_areas": null,
            "grid_template_columns": null,
            "grid_template_rows": null,
            "height": null,
            "justify_content": null,
            "justify_items": null,
            "left": null,
            "margin": null,
            "max_height": null,
            "max_width": null,
            "min_height": null,
            "min_width": null,
            "object_fit": null,
            "object_position": null,
            "order": null,
            "overflow": null,
            "overflow_x": null,
            "overflow_y": null,
            "padding": null,
            "right": null,
            "top": null,
            "visibility": null,
            "width": null
          }
        },
        "ed1fe3209f9440a38bcfa77b89f5c8ad": {
          "model_module": "@jupyter-widgets/controls",
          "model_name": "ProgressStyleModel",
          "model_module_version": "1.5.0",
          "state": {
            "_model_module": "@jupyter-widgets/controls",
            "_model_module_version": "1.5.0",
            "_model_name": "ProgressStyleModel",
            "_view_count": null,
            "_view_module": "@jupyter-widgets/base",
            "_view_module_version": "1.2.0",
            "_view_name": "StyleView",
            "bar_color": null,
            "description_width": ""
          }
        },
        "430e20b56d344c1d9942e4b50b77be77": {
          "model_module": "@jupyter-widgets/base",
          "model_name": "LayoutModel",
          "model_module_version": "1.2.0",
          "state": {
            "_model_module": "@jupyter-widgets/base",
            "_model_module_version": "1.2.0",
            "_model_name": "LayoutModel",
            "_view_count": null,
            "_view_module": "@jupyter-widgets/base",
            "_view_module_version": "1.2.0",
            "_view_name": "LayoutView",
            "align_content": null,
            "align_items": null,
            "align_self": null,
            "border": null,
            "bottom": null,
            "display": null,
            "flex": null,
            "flex_flow": null,
            "grid_area": null,
            "grid_auto_columns": null,
            "grid_auto_flow": null,
            "grid_auto_rows": null,
            "grid_column": null,
            "grid_gap": null,
            "grid_row": null,
            "grid_template_areas": null,
            "grid_template_columns": null,
            "grid_template_rows": null,
            "height": null,
            "justify_content": null,
            "justify_items": null,
            "left": null,
            "margin": null,
            "max_height": null,
            "max_width": null,
            "min_height": null,
            "min_width": null,
            "object_fit": null,
            "object_position": null,
            "order": null,
            "overflow": null,
            "overflow_x": null,
            "overflow_y": null,
            "padding": null,
            "right": null,
            "top": null,
            "visibility": null,
            "width": null
          }
        },
        "c7374c0a769a4dac96ace3670e6800e4": {
          "model_module": "@jupyter-widgets/controls",
          "model_name": "DescriptionStyleModel",
          "model_module_version": "1.5.0",
          "state": {
            "_model_module": "@jupyter-widgets/controls",
            "_model_module_version": "1.5.0",
            "_model_name": "DescriptionStyleModel",
            "_view_count": null,
            "_view_module": "@jupyter-widgets/base",
            "_view_module_version": "1.2.0",
            "_view_name": "StyleView",
            "description_width": ""
          }
        },
        "671a67e7a2a94007bfb337e0a3f20ca7": {
          "model_module": "@jupyter-widgets/controls",
          "model_name": "HBoxModel",
          "model_module_version": "1.5.0",
          "state": {
            "_dom_classes": [],
            "_model_module": "@jupyter-widgets/controls",
            "_model_module_version": "1.5.0",
            "_model_name": "HBoxModel",
            "_view_count": null,
            "_view_module": "@jupyter-widgets/controls",
            "_view_module_version": "1.5.0",
            "_view_name": "HBoxView",
            "box_style": "",
            "children": [
              "IPY_MODEL_61e487bf20834fbb889f25cb5d46e311",
              "IPY_MODEL_139588c346c042f8a5f67722166cd6b7",
              "IPY_MODEL_1820ad9809494ec1a755344245e91dda"
            ],
            "layout": "IPY_MODEL_6050da7f27f747e58ee98250544bad03"
          }
        },
        "61e487bf20834fbb889f25cb5d46e311": {
          "model_module": "@jupyter-widgets/controls",
          "model_name": "HTMLModel",
          "model_module_version": "1.5.0",
          "state": {
            "_dom_classes": [],
            "_model_module": "@jupyter-widgets/controls",
            "_model_module_version": "1.5.0",
            "_model_name": "HTMLModel",
            "_view_count": null,
            "_view_module": "@jupyter-widgets/controls",
            "_view_module_version": "1.5.0",
            "_view_name": "HTMLView",
            "description": "",
            "description_tooltip": null,
            "layout": "IPY_MODEL_091a2fc4fc9b4e9c8e683d2a04f01073",
            "placeholder": "​",
            "style": "IPY_MODEL_637a295bd69f412788f6073065a18934",
            "value": "100%"
          }
        },
        "139588c346c042f8a5f67722166cd6b7": {
          "model_module": "@jupyter-widgets/controls",
          "model_name": "FloatProgressModel",
          "model_module_version": "1.5.0",
          "state": {
            "_dom_classes": [],
            "_model_module": "@jupyter-widgets/controls",
            "_model_module_version": "1.5.0",
            "_model_name": "FloatProgressModel",
            "_view_count": null,
            "_view_module": "@jupyter-widgets/controls",
            "_view_module_version": "1.5.0",
            "_view_name": "ProgressView",
            "bar_style": "success",
            "description": "",
            "description_tooltip": null,
            "layout": "IPY_MODEL_e6a2483643c3481ea529538b8c86b8f3",
            "max": 313,
            "min": 0,
            "orientation": "horizontal",
            "style": "IPY_MODEL_b452afd37618427a801b35a9a6b0b310",
            "value": 313
          }
        },
        "1820ad9809494ec1a755344245e91dda": {
          "model_module": "@jupyter-widgets/controls",
          "model_name": "HTMLModel",
          "model_module_version": "1.5.0",
          "state": {
            "_dom_classes": [],
            "_model_module": "@jupyter-widgets/controls",
            "_model_module_version": "1.5.0",
            "_model_name": "HTMLModel",
            "_view_count": null,
            "_view_module": "@jupyter-widgets/controls",
            "_view_module_version": "1.5.0",
            "_view_name": "HTMLView",
            "description": "",
            "description_tooltip": null,
            "layout": "IPY_MODEL_f88e19b433254b69a26a08378073a6ca",
            "placeholder": "​",
            "style": "IPY_MODEL_198d76ef4b0c4cc7809b3a99b969f2f7",
            "value": " 313/313 [00:00&lt;00:00, 325.62it/s]"
          }
        },
        "6050da7f27f747e58ee98250544bad03": {
          "model_module": "@jupyter-widgets/base",
          "model_name": "LayoutModel",
          "model_module_version": "1.2.0",
          "state": {
            "_model_module": "@jupyter-widgets/base",
            "_model_module_version": "1.2.0",
            "_model_name": "LayoutModel",
            "_view_count": null,
            "_view_module": "@jupyter-widgets/base",
            "_view_module_version": "1.2.0",
            "_view_name": "LayoutView",
            "align_content": null,
            "align_items": null,
            "align_self": null,
            "border": null,
            "bottom": null,
            "display": null,
            "flex": null,
            "flex_flow": null,
            "grid_area": null,
            "grid_auto_columns": null,
            "grid_auto_flow": null,
            "grid_auto_rows": null,
            "grid_column": null,
            "grid_gap": null,
            "grid_row": null,
            "grid_template_areas": null,
            "grid_template_columns": null,
            "grid_template_rows": null,
            "height": null,
            "justify_content": null,
            "justify_items": null,
            "left": null,
            "margin": null,
            "max_height": null,
            "max_width": null,
            "min_height": null,
            "min_width": null,
            "object_fit": null,
            "object_position": null,
            "order": null,
            "overflow": null,
            "overflow_x": null,
            "overflow_y": null,
            "padding": null,
            "right": null,
            "top": null,
            "visibility": null,
            "width": null
          }
        },
        "091a2fc4fc9b4e9c8e683d2a04f01073": {
          "model_module": "@jupyter-widgets/base",
          "model_name": "LayoutModel",
          "model_module_version": "1.2.0",
          "state": {
            "_model_module": "@jupyter-widgets/base",
            "_model_module_version": "1.2.0",
            "_model_name": "LayoutModel",
            "_view_count": null,
            "_view_module": "@jupyter-widgets/base",
            "_view_module_version": "1.2.0",
            "_view_name": "LayoutView",
            "align_content": null,
            "align_items": null,
            "align_self": null,
            "border": null,
            "bottom": null,
            "display": null,
            "flex": null,
            "flex_flow": null,
            "grid_area": null,
            "grid_auto_columns": null,
            "grid_auto_flow": null,
            "grid_auto_rows": null,
            "grid_column": null,
            "grid_gap": null,
            "grid_row": null,
            "grid_template_areas": null,
            "grid_template_columns": null,
            "grid_template_rows": null,
            "height": null,
            "justify_content": null,
            "justify_items": null,
            "left": null,
            "margin": null,
            "max_height": null,
            "max_width": null,
            "min_height": null,
            "min_width": null,
            "object_fit": null,
            "object_position": null,
            "order": null,
            "overflow": null,
            "overflow_x": null,
            "overflow_y": null,
            "padding": null,
            "right": null,
            "top": null,
            "visibility": null,
            "width": null
          }
        },
        "637a295bd69f412788f6073065a18934": {
          "model_module": "@jupyter-widgets/controls",
          "model_name": "DescriptionStyleModel",
          "model_module_version": "1.5.0",
          "state": {
            "_model_module": "@jupyter-widgets/controls",
            "_model_module_version": "1.5.0",
            "_model_name": "DescriptionStyleModel",
            "_view_count": null,
            "_view_module": "@jupyter-widgets/base",
            "_view_module_version": "1.2.0",
            "_view_name": "StyleView",
            "description_width": ""
          }
        },
        "e6a2483643c3481ea529538b8c86b8f3": {
          "model_module": "@jupyter-widgets/base",
          "model_name": "LayoutModel",
          "model_module_version": "1.2.0",
          "state": {
            "_model_module": "@jupyter-widgets/base",
            "_model_module_version": "1.2.0",
            "_model_name": "LayoutModel",
            "_view_count": null,
            "_view_module": "@jupyter-widgets/base",
            "_view_module_version": "1.2.0",
            "_view_name": "LayoutView",
            "align_content": null,
            "align_items": null,
            "align_self": null,
            "border": null,
            "bottom": null,
            "display": null,
            "flex": null,
            "flex_flow": null,
            "grid_area": null,
            "grid_auto_columns": null,
            "grid_auto_flow": null,
            "grid_auto_rows": null,
            "grid_column": null,
            "grid_gap": null,
            "grid_row": null,
            "grid_template_areas": null,
            "grid_template_columns": null,
            "grid_template_rows": null,
            "height": null,
            "justify_content": null,
            "justify_items": null,
            "left": null,
            "margin": null,
            "max_height": null,
            "max_width": null,
            "min_height": null,
            "min_width": null,
            "object_fit": null,
            "object_position": null,
            "order": null,
            "overflow": null,
            "overflow_x": null,
            "overflow_y": null,
            "padding": null,
            "right": null,
            "top": null,
            "visibility": null,
            "width": null
          }
        },
        "b452afd37618427a801b35a9a6b0b310": {
          "model_module": "@jupyter-widgets/controls",
          "model_name": "ProgressStyleModel",
          "model_module_version": "1.5.0",
          "state": {
            "_model_module": "@jupyter-widgets/controls",
            "_model_module_version": "1.5.0",
            "_model_name": "ProgressStyleModel",
            "_view_count": null,
            "_view_module": "@jupyter-widgets/base",
            "_view_module_version": "1.2.0",
            "_view_name": "StyleView",
            "bar_color": null,
            "description_width": ""
          }
        },
        "f88e19b433254b69a26a08378073a6ca": {
          "model_module": "@jupyter-widgets/base",
          "model_name": "LayoutModel",
          "model_module_version": "1.2.0",
          "state": {
            "_model_module": "@jupyter-widgets/base",
            "_model_module_version": "1.2.0",
            "_model_name": "LayoutModel",
            "_view_count": null,
            "_view_module": "@jupyter-widgets/base",
            "_view_module_version": "1.2.0",
            "_view_name": "LayoutView",
            "align_content": null,
            "align_items": null,
            "align_self": null,
            "border": null,
            "bottom": null,
            "display": null,
            "flex": null,
            "flex_flow": null,
            "grid_area": null,
            "grid_auto_columns": null,
            "grid_auto_flow": null,
            "grid_auto_rows": null,
            "grid_column": null,
            "grid_gap": null,
            "grid_row": null,
            "grid_template_areas": null,
            "grid_template_columns": null,
            "grid_template_rows": null,
            "height": null,
            "justify_content": null,
            "justify_items": null,
            "left": null,
            "margin": null,
            "max_height": null,
            "max_width": null,
            "min_height": null,
            "min_width": null,
            "object_fit": null,
            "object_position": null,
            "order": null,
            "overflow": null,
            "overflow_x": null,
            "overflow_y": null,
            "padding": null,
            "right": null,
            "top": null,
            "visibility": null,
            "width": null
          }
        },
        "198d76ef4b0c4cc7809b3a99b969f2f7": {
          "model_module": "@jupyter-widgets/controls",
          "model_name": "DescriptionStyleModel",
          "model_module_version": "1.5.0",
          "state": {
            "_model_module": "@jupyter-widgets/controls",
            "_model_module_version": "1.5.0",
            "_model_name": "DescriptionStyleModel",
            "_view_count": null,
            "_view_module": "@jupyter-widgets/base",
            "_view_module_version": "1.2.0",
            "_view_name": "StyleView",
            "description_width": ""
          }
        }
      }
    }
  },
  "cells": [
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "view-in-github",
        "colab_type": "text"
      },
      "source": [
        "<a href=\"https://colab.research.google.com/github/mrdbourke/pytorch-deep-learning/blob/main/extras/solutions/03_pytorch_computer_vision_exercise_solutions.ipynb\" target=\"_parent\"><img src=\"https://colab.research.google.com/assets/colab-badge.svg\" alt=\"Open In Colab\"/></a>"
      ]
    },
    {
      "cell_type": "markdown",
      "source": [
        "# 03. PyTorch Computer Vision Exercise Solutions\n",
        "\n",
        "The following is one possible set (there may be more than one way to do things) of solutions for the 03. PyTorch Computer Vision exercise template.\n",
        "\n",
        "## Resources\n",
        "\n",
        "1. These exercises/solutions are based on [notebook 03 of the Learn PyTorch for Deep Learning course](https://www.learnpytorch.io/03_pytorch_computer_vision/). \n",
        "2. See a live [walkthrough of the solutions (errors and all) on YouTube](https://youtu.be/_PibmqpEyhA). \n",
        "  * **Note:** Going through these exercises took me just over 3 hours, so you should expect around the same.\n",
        "3. See [other solutions on the course GitHub](https://github.com/mrdbourke/pytorch-deep-learning/tree/main/extras/solutions)."
      ],
      "metadata": {
        "id": "Vex99np2wFVt"
      }
    },
    {
      "cell_type": "code",
      "source": [
        "# Check for GPU\n",
        "!nvidia-smi"
      ],
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/"
        },
        "id": "GaeYzOTLwWh2",
        "outputId": "17dd5453-9639-4b01-aa18-7ddbfd5c3253"
      },
      "execution_count": 1,
      "outputs": [
        {
          "output_type": "stream",
          "name": "stdout",
          "text": [
            "Sat Apr 16 03:23:02 2022       \n",
            "+-----------------------------------------------------------------------------+\n",
            "| NVIDIA-SMI 460.32.03    Driver Version: 460.32.03    CUDA Version: 11.2     |\n",
            "|-------------------------------+----------------------+----------------------+\n",
            "| GPU  Name        Persistence-M| Bus-Id        Disp.A | Volatile Uncorr. ECC |\n",
            "| Fan  Temp  Perf  Pwr:Usage/Cap|         Memory-Usage | GPU-Util  Compute M. |\n",
            "|                               |                      |               MIG M. |\n",
            "|===============================+======================+======================|\n",
            "|   0  Tesla P100-PCIE...  Off  | 00000000:00:04.0 Off |                    0 |\n",
            "| N/A   39C    P0    29W / 250W |      0MiB / 16280MiB |      0%      Default |\n",
            "|                               |                      |                  N/A |\n",
            "+-------------------------------+----------------------+----------------------+\n",
            "                                                                               \n",
            "+-----------------------------------------------------------------------------+\n",
            "| Processes:                                                                  |\n",
            "|  GPU   GI   CI        PID   Type   Process name                  GPU Memory |\n",
            "|        ID   ID                                                   Usage      |\n",
            "|=============================================================================|\n",
            "|  No running processes found                                                 |\n",
            "+-----------------------------------------------------------------------------+\n"
          ]
        }
      ]
    },
    {
      "cell_type": "code",
      "source": [
        "# Import torch\n",
        "import torch\n",
        "\n",
        "# Exercises require PyTorch > 1.10.0\n",
        "print(torch.__version__)\n",
        "\n",
        "# Setup device agnostic code\n",
        "device = \"cuda\" if torch.cuda.is_available() else \"cpu\"\n",
        "device"
      ],
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 53
        },
        "id": "DNwZLMbCzJLk",
        "outputId": "9c150c50-a092-4f34-9d33-b45247fb080d"
      },
      "execution_count": 2,
      "outputs": [
        {
          "output_type": "stream",
          "name": "stdout",
          "text": [
            "1.10.0+cu111\n"
          ]
        },
        {
          "output_type": "execute_result",
          "data": {
            "text/plain": [
              "'cuda'"
            ],
            "application/vnd.google.colaboratory.intrinsic+json": {
              "type": "string"
            }
          },
          "metadata": {},
          "execution_count": 2
        }
      ]
    },
    {
      "cell_type": "markdown",
      "source": [
        "## 1. What are 3 areas in industry where computer vision is currently being used?"
      ],
      "metadata": {
        "id": "FSFX7tc1w-en"
      }
    },
    {
      "cell_type": "markdown",
      "source": [
        "1. Self-driving cars, such as Tesla using computer vision to percieve what's happening on the road. See Tesla AI day for more - https://youtu.be/j0z4FweCy4M\n",
        "2. Healthcare imaging, such as using computer vision to help interpret X-rays. Google also uses computer vision for detecting polyps in the intenstines - https://ai.googleblog.com/2021/08/improved-detection-of-elusive-polyps.html\n",
        "3. Security, computer vision can be used to detect whether someone is invading your home or not - https://store.google.com/au/product/nest_cam_battery?hl=en-GB"
      ],
      "metadata": {
        "id": "CmB6iAzN1X4u"
      }
    },
    {
      "cell_type": "markdown",
      "source": [
        "## 2. Search \"what is overfitting in machine learning\" and write down a sentence about what you find. "
      ],
      "metadata": {
        "id": "oBK-WI6YxDYa"
      }
    },
    {
      "cell_type": "markdown",
      "source": [
        "Overfitting is like memorizing for a test but then you can't answer a question that's slightly different.\n",
        "\n",
        "In other words, if a model is overfitting, it's learning the training data *too well* and these patterns don't generalize to unseen data."
      ],
      "metadata": {
        "id": "bMLaps1J3pJ_"
      }
    },
    {
      "cell_type": "markdown",
      "source": [
        "## 3. Search \"ways to prevent overfitting in machine learning\", write down 3 of the things you find and a sentence about each. \n",
        "> **Note:** there are lots of these, so don't worry too much about all of them, just pick 3 and start with those."
      ],
      "metadata": {
        "id": "XeYFEqw8xK26"
      }
    },
    {
      "cell_type": "markdown",
      "source": [
        "See this article for some ideas: https://elitedatascience.com/overfitting-in-machine-learning \n",
        "\n",
        "3 ways to prevent overfitting:\n",
        "1. **Regularization techniques** - You could use [dropout on your neural networks](https://en.wikipedia.org/wiki/Dilution_(neural_networks)), dropout involves randomly removing neurons in different layers so that the remaining neurons hopefully learn more robust weights/patterns.\n",
        "2. **Use a different model** - maybe the model you're using for a specific problem is too complicated, as in, it's learning the data too well because it has so many layers. You could remove some layers to simplify your model. Or you could pick a totally different model altogether, one that may be more suited to your particular problem. Or... you could also use [transfer learning](https://en.wikipedia.org/wiki/Transfer_learning) (taking the patterns from one model and applying them to your own problem). \n",
        "3. **Reduce noise in data/cleanup dataset/introduce data augmentation techniques** - If the model is learning the data too well, it might be just memorizing the data, including the noise. One option would be to remove the noise/clean up the dataset or if this doesn't, you can introduce artificial noise through the use of data augmentation to artificially increase the diversity of your training dataset."
      ],
      "metadata": {
        "id": "i9Hdd08s4kvN"
      }
    },
    {
      "cell_type": "markdown",
      "source": [
        "## 4. Spend 20-minutes reading and clicking through the [CNN Explainer website](https://poloclub.github.io/cnn-explainer/).\n",
        "\n",
        "* Upload your own example image using the \"upload\" button on the website and see what happens in each layer of a CNN as your image passes through it."
      ],
      "metadata": {
        "id": "DKdEEFEqxM-8"
      }
    },
    {
      "cell_type": "markdown",
      "source": [
        "The CNN explainer website is a great insight into all of the nuts and bolts of a convolutional neural network."
      ],
      "metadata": {
        "id": "rnUox1qayDes"
      }
    },
    {
      "cell_type": "markdown",
      "source": [
        "## 5. Load the [`torchvision.datasets.MNIST()`](https://pytorch.org/vision/stable/generated/torchvision.datasets.MNIST.html#torchvision.datasets.MNIST) train and test datasets."
      ],
      "metadata": {
        "id": "lvf-3pODxXYI"
      }
    },
    {
      "cell_type": "code",
      "source": [
        "import torchvision\n",
        "from torchvision import datasets\n",
        "\n",
        "from torchvision import transforms"
      ],
      "metadata": {
        "id": "rV7s2qtIyDIZ"
      },
      "execution_count": 3,
      "outputs": []
    },
    {
      "cell_type": "code",
      "source": [
        "# Get the MNIST train dataset \n",
        "train_data = datasets.MNIST(root=\".\",\n",
        "                            train=True,\n",
        "                            download=True,\n",
        "                            transform=transforms.ToTensor()) # do we want to transform the data as we download it? \n",
        "\n",
        "# Get the MNIST test dataset\n",
        "test_data = datasets.MNIST(root=\".\",\n",
        "                           train=False,\n",
        "                           download=True,\n",
        "                           transform=transforms.ToTensor()) "
      ],
      "metadata": {
        "id": "tVnyuGku9m0y"
      },
      "execution_count": 4,
      "outputs": []
    },
    {
      "cell_type": "code",
      "source": [
        "train_data, test_data"
      ],
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/"
        },
        "id": "yaj7vnOv-cB2",
        "outputId": "41fff41b-49da-40c2-ac30-75a75aeb3a62"
      },
      "execution_count": 5,
      "outputs": [
        {
          "output_type": "execute_result",
          "data": {
            "text/plain": [
              "(Dataset MNIST\n",
              "     Number of datapoints: 60000\n",
              "     Root location: .\n",
              "     Split: Train\n",
              "     StandardTransform\n",
              " Transform: ToTensor(), Dataset MNIST\n",
              "     Number of datapoints: 10000\n",
              "     Root location: .\n",
              "     Split: Test\n",
              "     StandardTransform\n",
              " Transform: ToTensor())"
            ]
          },
          "metadata": {},
          "execution_count": 5
        }
      ]
    },
    {
      "cell_type": "code",
      "source": [
        "len(train_data), len(test_data)"
      ],
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/"
        },
        "id": "SUZMY9xR-sfH",
        "outputId": "57734dba-f7a7-42e8-8eb9-9dfa43216243"
      },
      "execution_count": 6,
      "outputs": [
        {
          "output_type": "execute_result",
          "data": {
            "text/plain": [
              "(60000, 10000)"
            ]
          },
          "metadata": {},
          "execution_count": 6
        }
      ]
    },
    {
      "cell_type": "code",
      "source": [
        "# Data is in tuple form (image, label)\n",
        "img = train_data[0][0]\n",
        "label = train_data[0][1]\n",
        "print(f\"Image:\\n {img}\") \n",
        "print(f\"Label:\\n {label}\")"
      ],
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/"
        },
        "id": "THsDkX0K-gUk",
        "outputId": "545d643d-a50a-4d88-e2b6-6e69ce99dde4"
      },
      "execution_count": 7,
      "outputs": [
        {
          "output_type": "stream",
          "name": "stdout",
          "text": [
            "Image:\n",
            " tensor([[[0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000,\n",
            "          0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000,\n",
            "          0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000,\n",
            "          0.0000, 0.0000, 0.0000, 0.0000],\n",
            "         [0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000,\n",
            "          0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000,\n",
            "          0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000,\n",
            "          0.0000, 0.0000, 0.0000, 0.0000],\n",
            "         [0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000,\n",
            "          0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000,\n",
            "          0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000,\n",
            "          0.0000, 0.0000, 0.0000, 0.0000],\n",
            "         [0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000,\n",
            "          0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000,\n",
            "          0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000,\n",
            "          0.0000, 0.0000, 0.0000, 0.0000],\n",
            "         [0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000,\n",
            "          0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000,\n",
            "          0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000,\n",
            "          0.0000, 0.0000, 0.0000, 0.0000],\n",
            "         [0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000,\n",
            "          0.0000, 0.0000, 0.0000, 0.0000, 0.0118, 0.0706, 0.0706, 0.0706,\n",
            "          0.4941, 0.5333, 0.6863, 0.1020, 0.6510, 1.0000, 0.9686, 0.4980,\n",
            "          0.0000, 0.0000, 0.0000, 0.0000],\n",
            "         [0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000,\n",
            "          0.1176, 0.1412, 0.3686, 0.6039, 0.6667, 0.9922, 0.9922, 0.9922,\n",
            "          0.9922, 0.9922, 0.8824, 0.6745, 0.9922, 0.9490, 0.7647, 0.2510,\n",
            "          0.0000, 0.0000, 0.0000, 0.0000],\n",
            "         [0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.1922,\n",
            "          0.9333, 0.9922, 0.9922, 0.9922, 0.9922, 0.9922, 0.9922, 0.9922,\n",
            "          0.9922, 0.9843, 0.3647, 0.3216, 0.3216, 0.2196, 0.1529, 0.0000,\n",
            "          0.0000, 0.0000, 0.0000, 0.0000],\n",
            "         [0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0706,\n",
            "          0.8588, 0.9922, 0.9922, 0.9922, 0.9922, 0.9922, 0.7765, 0.7137,\n",
            "          0.9686, 0.9451, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000,\n",
            "          0.0000, 0.0000, 0.0000, 0.0000],\n",
            "         [0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000,\n",
            "          0.3137, 0.6118, 0.4196, 0.9922, 0.9922, 0.8039, 0.0431, 0.0000,\n",
            "          0.1686, 0.6039, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000,\n",
            "          0.0000, 0.0000, 0.0000, 0.0000],\n",
            "         [0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000,\n",
            "          0.0000, 0.0549, 0.0039, 0.6039, 0.9922, 0.3529, 0.0000, 0.0000,\n",
            "          0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000,\n",
            "          0.0000, 0.0000, 0.0000, 0.0000],\n",
            "         [0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000,\n",
            "          0.0000, 0.0000, 0.0000, 0.5451, 0.9922, 0.7451, 0.0078, 0.0000,\n",
            "          0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000,\n",
            "          0.0000, 0.0000, 0.0000, 0.0000],\n",
            "         [0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000,\n",
            "          0.0000, 0.0000, 0.0000, 0.0431, 0.7451, 0.9922, 0.2745, 0.0000,\n",
            "          0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000,\n",
            "          0.0000, 0.0000, 0.0000, 0.0000],\n",
            "         [0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000,\n",
            "          0.0000, 0.0000, 0.0000, 0.0000, 0.1373, 0.9451, 0.8824, 0.6275,\n",
            "          0.4235, 0.0039, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000,\n",
            "          0.0000, 0.0000, 0.0000, 0.0000],\n",
            "         [0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000,\n",
            "          0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.3176, 0.9412, 0.9922,\n",
            "          0.9922, 0.4667, 0.0980, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000,\n",
            "          0.0000, 0.0000, 0.0000, 0.0000],\n",
            "         [0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000,\n",
            "          0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.1765, 0.7294,\n",
            "          0.9922, 0.9922, 0.5882, 0.1059, 0.0000, 0.0000, 0.0000, 0.0000,\n",
            "          0.0000, 0.0000, 0.0000, 0.0000],\n",
            "         [0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000,\n",
            "          0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0627,\n",
            "          0.3647, 0.9882, 0.9922, 0.7333, 0.0000, 0.0000, 0.0000, 0.0000,\n",
            "          0.0000, 0.0000, 0.0000, 0.0000],\n",
            "         [0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000,\n",
            "          0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000,\n",
            "          0.0000, 0.9765, 0.9922, 0.9765, 0.2510, 0.0000, 0.0000, 0.0000,\n",
            "          0.0000, 0.0000, 0.0000, 0.0000],\n",
            "         [0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000,\n",
            "          0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.1804, 0.5098,\n",
            "          0.7176, 0.9922, 0.9922, 0.8118, 0.0078, 0.0000, 0.0000, 0.0000,\n",
            "          0.0000, 0.0000, 0.0000, 0.0000],\n",
            "         [0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000,\n",
            "          0.0000, 0.0000, 0.0000, 0.0000, 0.1529, 0.5804, 0.8980, 0.9922,\n",
            "          0.9922, 0.9922, 0.9804, 0.7137, 0.0000, 0.0000, 0.0000, 0.0000,\n",
            "          0.0000, 0.0000, 0.0000, 0.0000],\n",
            "         [0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000,\n",
            "          0.0000, 0.0000, 0.0941, 0.4471, 0.8667, 0.9922, 0.9922, 0.9922,\n",
            "          0.9922, 0.7882, 0.3059, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000,\n",
            "          0.0000, 0.0000, 0.0000, 0.0000],\n",
            "         [0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000,\n",
            "          0.0902, 0.2588, 0.8353, 0.9922, 0.9922, 0.9922, 0.9922, 0.7765,\n",
            "          0.3176, 0.0078, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000,\n",
            "          0.0000, 0.0000, 0.0000, 0.0000],\n",
            "         [0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0706, 0.6706,\n",
            "          0.8588, 0.9922, 0.9922, 0.9922, 0.9922, 0.7647, 0.3137, 0.0353,\n",
            "          0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000,\n",
            "          0.0000, 0.0000, 0.0000, 0.0000],\n",
            "         [0.0000, 0.0000, 0.0000, 0.0000, 0.2157, 0.6745, 0.8863, 0.9922,\n",
            "          0.9922, 0.9922, 0.9922, 0.9569, 0.5216, 0.0431, 0.0000, 0.0000,\n",
            "          0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000,\n",
            "          0.0000, 0.0000, 0.0000, 0.0000],\n",
            "         [0.0000, 0.0000, 0.0000, 0.0000, 0.5333, 0.9922, 0.9922, 0.9922,\n",
            "          0.8314, 0.5294, 0.5176, 0.0627, 0.0000, 0.0000, 0.0000, 0.0000,\n",
            "          0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000,\n",
            "          0.0000, 0.0000, 0.0000, 0.0000],\n",
            "         [0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000,\n",
            "          0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000,\n",
            "          0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000,\n",
            "          0.0000, 0.0000, 0.0000, 0.0000],\n",
            "         [0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000,\n",
            "          0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000,\n",
            "          0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000,\n",
            "          0.0000, 0.0000, 0.0000, 0.0000],\n",
            "         [0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000,\n",
            "          0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000,\n",
            "          0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000,\n",
            "          0.0000, 0.0000, 0.0000, 0.0000]]])\n",
            "Label:\n",
            " 5\n"
          ]
        }
      ]
    },
    {
      "cell_type": "code",
      "source": [
        "# Check out the shapes of our data\n",
        "print(f\"Image shape: {img.shape} -> [color_channels, height, width] (CHW)\")\n",
        "print(f\"Label: {label} -> no shape, due to being integer\")"
      ],
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/"
        },
        "id": "txys9vVXAUPs",
        "outputId": "ac305c09-6260-4744-9bd9-832e4dbde593"
      },
      "execution_count": 8,
      "outputs": [
        {
          "output_type": "stream",
          "name": "stdout",
          "text": [
            "Image shape: torch.Size([1, 28, 28]) -> [color_channels, height, width] (CHW)\n",
            "Label: 5 -> no shape, due to being integer\n"
          ]
        }
      ]
    },
    {
      "cell_type": "markdown",
      "source": [
        "Note: There are two main agreed upon ways for representing images in machine learning:\n",
        "1. Color channels first: [color_channels, height, width] (CHW) -> PyTorch default (as of April 2022)\n",
        "2. Color channels last: [height, width, color_channels] (HWC) -> Matplotlib/TensorFlow default (as of April 2022)"
      ],
      "metadata": {
        "id": "yS3XHDW6AuJs"
      }
    },
    {
      "cell_type": "code",
      "source": [
        "# Get the class names from the dataset\n",
        "class_names = train_data.classes\n",
        "class_names"
      ],
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/"
        },
        "id": "T7UEVf8B_JuK",
        "outputId": "6795c6d6-8e66-43bc-e7f8-6f1b737f2621"
      },
      "execution_count": 9,
      "outputs": [
        {
          "output_type": "execute_result",
          "data": {
            "text/plain": [
              "['0 - zero',\n",
              " '1 - one',\n",
              " '2 - two',\n",
              " '3 - three',\n",
              " '4 - four',\n",
              " '5 - five',\n",
              " '6 - six',\n",
              " '7 - seven',\n",
              " '8 - eight',\n",
              " '9 - nine']"
            ]
          },
          "metadata": {},
          "execution_count": 9
        }
      ]
    },
    {
      "cell_type": "markdown",
      "source": [
        "## 6. Visualize at least 5 different samples of the MNIST training dataset."
      ],
      "metadata": {
        "id": "qxZW-uAbxe_F"
      }
    },
    {
      "cell_type": "code",
      "source": [
        "import matplotlib.pyplot as plt\n",
        "for i in range(5):\n",
        "  img = train_data[i][0]\n",
        "  print(img.shape)\n",
        "  img_squeeze = img.squeeze()\n",
        "  print(img_squeeze.shape)\n",
        "  label = train_data[i][1]\n",
        "  plt.figure(figsize=(3, 3))\n",
        "  plt.imshow(img_squeeze, cmap=\"gray\")\n",
        "  plt.title(label)\n",
        "  plt.axis(False);"
      ],
      "metadata": {
        "id": "HdRM86voyC0x",
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 1000
        },
        "outputId": "76d699f7-6c6b-4cd8-df21-a48da1b7c141"
      },
      "execution_count": 10,
      "outputs": [
        {
          "output_type": "stream",
          "name": "stdout",
          "text": [
            "torch.Size([1, 28, 28])\n",
            "torch.Size([28, 28])\n",
            "torch.Size([1, 28, 28])\n",
            "torch.Size([28, 28])\n",
            "torch.Size([1, 28, 28])\n",
            "torch.Size([28, 28])\n",
            "torch.Size([1, 28, 28])\n",
            "torch.Size([28, 28])\n",
            "torch.Size([1, 28, 28])\n",
            "torch.Size([28, 28])\n"
          ]
        },
        {
          "output_type": "display_data",
          "data": {
            "text/plain": [
              "<Figure size 216x216 with 1 Axes>"
            ],
            "image/png": "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\n"
          },
          "metadata": {
            "needs_background": "light"
          }
        },
        {
          "output_type": "display_data",
          "data": {
            "text/plain": [
              "<Figure size 216x216 with 1 Axes>"
            ],
            "image/png": "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\n"
          },
          "metadata": {
            "needs_background": "light"
          }
        },
        {
          "output_type": "display_data",
          "data": {
            "text/plain": [
              "<Figure size 216x216 with 1 Axes>"
            ],
            "image/png": "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\n"
          },
          "metadata": {
            "needs_background": "light"
          }
        },
        {
          "output_type": "display_data",
          "data": {
            "text/plain": [
              "<Figure size 216x216 with 1 Axes>"
            ],
            "image/png": "iVBORw0KGgoAAAANSUhEUgAAALEAAADBCAYAAACAC1EEAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADh0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uMy4yLjIsIGh0dHA6Ly9tYXRwbG90bGliLm9yZy+WH4yJAAAEv0lEQVR4nO3dsWpUWRzH8XOiRRYLlaQQWdAnCBZbprAIroKFldVCfIBNJ2SLNIEtAlYi2ibYZyEPIGojFvsAsRFSZCFWFsKyQbxbbLo5CTNxZie/m8+nkj/hcJCvBz3OnVu7riuQbGbaG4DvJWLiiZh4IiaeiIknYuKJmHginpBa66+11j9rrf/UWremvZ8+uzjtDfTYX6WU30spP5dSfpjyXnpNxBPSdd0fpZRSa/2plPLjlLfTa/46QTwRE0/ExBMx8fzDbkJqrRfLf7+/F0opF2qts6WUr13XfZ3uzvrHSTw5a6WUv0spv5VSfjn69dpUd9RT1YfiSeckJp6IiSdi4omYeCIm3on3xLVWVxecGV3X1dbcSUw8ERNPxMQTMfFETDwRE0/ExBMx8URMPBETT8TEEzHxREw8ERNPxMQTMfFETDwRE0/ExBMx8URMPBETT8TEEzHxREw8ERNPxMTzzo5wa2vtNyisr6835zMz7XPr9u3bzfnbt29Pta//k5OYeCImnoiJJ2LiiZh4bieCPHr0aGC2urra/Nlv376NtHby+wydxMQTMfFETDwRE0/ExHM7EeTGjRsDs9nZ2Sns5GxxEhNPxMQTMfFETDwRE8/txBm0tLTUnK+srAy9xu7ubnN+//795vzg4GDotc8aJzHxREw8ERNPxMQTMfHcTkzR4uJic765udmcX758eei1nzx50pzv7e0NvUYKJzHxREw8ERNPxMQTMfHcTkzR8vJyc379+vWh13jz5k1z/vLly9NsKZKTmHgiJp6IiSdi4tWTvkiu1pr7LXNnyPz8fHN+3AfRj/sywM+fPw/MHj582PzZ169fD7m7HF3X1dbcSUw8ERNPxMQTMfFETDz/7TxGN2/ebM63t7fHsv6zZ88GZn28hRiVk5h4IiaeiIknYuKJmHhuJ8bo7t27zfnCwsJI67x69ao5f/r06ch7Og+cxMQTMfFETDwRE0/ExPNkxyk8ePCgOd/a2mrOL1261Jy/e/euOT/uaY3kVxKMgyc76C0RE0/ExBMx8URMPJ+dOMGkn9T4+PFjc37ebyFG5SQmnoiJJ2LiiZh4Iiae24kTrK6uNufHfWvlqDY2NsayznnnJCaeiIknYuKJmHgiJp7biSO3bt0amN25c2csa+/s7DTnHz58GMv6552TmHgiJp6IiSdi4nlk/8inT58GZlevXh1pjffv3zfn9+7da86/fPky0vrnnUf26S0RE0/ExBMx8URMPP/tfGRubm5gNuqH31+8eNGcu4WYLCcx8URMPBETT8TEEzHxzt3txObmZnM+M/P9f56Pe30Bk+UkJp6IiSdi4omYeCImXm9vJ1qP4JdSytLSUnPe+pzE4eFh82efP3/enHtNwXQ4iYknYuKJmHgiJp6Iidfb24krV64059euXRt6jf39/eb88ePHp9oTk+EkJp6IiSdi4omYeCImnoiJJ2LiiZh4IiaeiIknYuL19rMTu7u7zflx3w2xuLg4ye0wQU5i4omYeCImnoiJ52WMxPAyRnpLxMQTMfFETDwRE0/ExBMx8URMPBETT8TEEzHxREw8ERNPxMQTMfFETDwRE+/EJzsggZOYeCImnoiJJ2LiiZh4Iibev2jrvt41NbyaAAAAAElFTkSuQmCC\n"
          },
          "metadata": {
            "needs_background": "light"
          }
        },
        {
          "output_type": "display_data",
          "data": {
            "text/plain": [
              "<Figure size 216x216 with 1 Axes>"
            ],
            "image/png": "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\n"
          },
          "metadata": {
            "needs_background": "light"
          }
        }
      ]
    },
    {
      "cell_type": "markdown",
      "source": [
        "## 7. Turn the MNIST train and test datasets into dataloaders using `torch.utils.data.DataLoader`, set the `batch_size=32`."
      ],
      "metadata": {
        "id": "JAPDzW0wxhi3"
      }
    },
    {
      "cell_type": "code",
      "source": [
        "# Create train dataloader\n",
        "from torch.utils.data import DataLoader\n",
        "\n",
        "train_dataloader = DataLoader(dataset=train_data,\n",
        "                              batch_size=32,\n",
        "                              shuffle=True)\n",
        "\n",
        "test_dataloader = DataLoader(dataset=test_data,\n",
        "                             batch_size=32,\n",
        "                             shuffle=False)"
      ],
      "metadata": {
        "id": "Cz09bv8KCnCa"
      },
      "execution_count": 11,
      "outputs": []
    },
    {
      "cell_type": "code",
      "source": [
        "train_dataloader, test_dataloader"
      ],
      "metadata": {
        "id": "8tWfa7Y0yCkX",
        "colab": {
          "base_uri": "https://localhost:8080/"
        },
        "outputId": "7aa11575-fdc6-48d8-e73b-9d8fe5f3049c"
      },
      "execution_count": 12,
      "outputs": [
        {
          "output_type": "execute_result",
          "data": {
            "text/plain": [
              "(<torch.utils.data.dataloader.DataLoader at 0x7f77f1f3ce50>,\n",
              " <torch.utils.data.dataloader.DataLoader at 0x7f77f19416d0>)"
            ]
          },
          "metadata": {},
          "execution_count": 12
        }
      ]
    },
    {
      "cell_type": "code",
      "source": [
        "for sample in next(iter(train_dataloader)):\n",
        "  print(sample.shape)"
      ],
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/"
        },
        "id": "z2-3iYEgD8K-",
        "outputId": "ebdeeedd-b03a-4ff1-abe3-e420fdbfe266"
      },
      "execution_count": 13,
      "outputs": [
        {
          "output_type": "stream",
          "name": "stdout",
          "text": [
            "torch.Size([32, 1, 28, 28])\n",
            "torch.Size([32])\n"
          ]
        }
      ]
    },
    {
      "cell_type": "code",
      "source": [
        "len(train_dataloader), len(test_dataloader)"
      ],
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/"
        },
        "id": "BfSrUoa9Eb3V",
        "outputId": "09af0e0b-3347-4c06-d542-b4971fe83c2d"
      },
      "execution_count": 14,
      "outputs": [
        {
          "output_type": "execute_result",
          "data": {
            "text/plain": [
              "(1875, 313)"
            ]
          },
          "metadata": {},
          "execution_count": 14
        }
      ]
    },
    {
      "cell_type": "markdown",
      "source": [
        "## 8. Recreate `model_2` used in notebook 03 (the same model from the [CNN Explainer website](https://poloclub.github.io/cnn-explainer/), also known as TinyVGG) capable of fitting on the MNIST dataset."
      ],
      "metadata": {
        "id": "bCCVfXk5xjYS"
      }
    },
    {
      "cell_type": "code",
      "source": [
        "from torch import nn \n",
        "class MNIST_model(torch.nn.Module):\n",
        "  \"\"\"Model capable of predicting on MNIST dataset.\n",
        "  \"\"\"\n",
        "  def __init__(self, input_shape: int, hidden_units: int, output_shape: int): \n",
        "    super().__init__()\n",
        "    self.conv_block_1 = nn.Sequential(\n",
        "      nn.Conv2d(in_channels=input_shape, \n",
        "                out_channels=hidden_units,\n",
        "                kernel_size=3,\n",
        "                stride=1,\n",
        "                padding=1), \n",
        "      nn.ReLU(),\n",
        "      nn.Conv2d(in_channels=hidden_units,\n",
        "                out_channels=hidden_units,\n",
        "                kernel_size=3,\n",
        "                stride=1,\n",
        "                padding=1),\n",
        "      nn.ReLU(),\n",
        "      nn.MaxPool2d(kernel_size=2)\n",
        "    )\n",
        "    self.conv_block_2 = nn.Sequential(\n",
        "      nn.Conv2d(in_channels=hidden_units,\n",
        "                out_channels=hidden_units,\n",
        "                kernel_size=3,\n",
        "                stride=1,\n",
        "                padding=1),\n",
        "      nn.ReLU(),\n",
        "      nn.Conv2d(in_channels=hidden_units,\n",
        "                out_channels=hidden_units,\n",
        "                kernel_size=3,\n",
        "                stride=1,\n",
        "                padding=1),\n",
        "      nn.ReLU(),\n",
        "      nn.MaxPool2d(kernel_size=2)                   \n",
        "    )\n",
        "    self.classifier = nn.Sequential(\n",
        "      nn.Flatten(),\n",
        "      nn.Linear(in_features=hidden_units*7*7,\n",
        "                out_features=output_shape)\n",
        "    )\n",
        "\n",
        "  def forward(self, x):\n",
        "    x = self.conv_block_1(x)\n",
        "    # print(f\"Output shape of conv block 1: {x.shape}\")\n",
        "    x = self.conv_block_2(x)\n",
        "    # print(f\"Output shape of conv block 2: {x.shape}\")\n",
        "    x = self.classifier(x)\n",
        "    # print(f\"Output shape of classifier: {x.shape}\")\n",
        "    return x"
      ],
      "metadata": {
        "id": "xeBNV2AtyCP6"
      },
      "execution_count": 15,
      "outputs": []
    },
    {
      "cell_type": "code",
      "source": [
        "device"
      ],
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 35
        },
        "id": "Pfk9zykYK0FM",
        "outputId": "42691d91-8854-4324-a6e7-776535283d11"
      },
      "execution_count": 16,
      "outputs": [
        {
          "output_type": "execute_result",
          "data": {
            "text/plain": [
              "'cuda'"
            ],
            "application/vnd.google.colaboratory.intrinsic+json": {
              "type": "string"
            }
          },
          "metadata": {},
          "execution_count": 16
        }
      ]
    },
    {
      "cell_type": "code",
      "source": [
        "model = MNIST_model(input_shape=1,\n",
        "                    hidden_units=10,\n",
        "                    output_shape=10).to(device)\n",
        "model"
      ],
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/"
        },
        "id": "tPmadzsTJndN",
        "outputId": "af86f59c-d3a0-4fdf-9095-cc5b4885226e"
      },
      "execution_count": 17,
      "outputs": [
        {
          "output_type": "execute_result",
          "data": {
            "text/plain": [
              "MNIST_model(\n",
              "  (conv_block_1): Sequential(\n",
              "    (0): Conv2d(1, 10, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))\n",
              "    (1): ReLU()\n",
              "    (2): Conv2d(10, 10, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))\n",
              "    (3): ReLU()\n",
              "    (4): MaxPool2d(kernel_size=2, stride=2, padding=0, dilation=1, ceil_mode=False)\n",
              "  )\n",
              "  (conv_block_2): Sequential(\n",
              "    (0): Conv2d(10, 10, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))\n",
              "    (1): ReLU()\n",
              "    (2): Conv2d(10, 10, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))\n",
              "    (3): ReLU()\n",
              "    (4): MaxPool2d(kernel_size=2, stride=2, padding=0, dilation=1, ceil_mode=False)\n",
              "  )\n",
              "  (classifier): Sequential(\n",
              "    (0): Flatten(start_dim=1, end_dim=-1)\n",
              "    (1): Linear(in_features=490, out_features=10, bias=True)\n",
              "  )\n",
              ")"
            ]
          },
          "metadata": {},
          "execution_count": 17
        }
      ]
    },
    {
      "cell_type": "code",
      "source": [
        "# Check out the model state dict to find out what patterns our model wants to learn\n",
        "# model.state_dict()"
      ],
      "metadata": {
        "id": "ExNGpLz9LfOO"
      },
      "execution_count": 18,
      "outputs": []
    },
    {
      "cell_type": "code",
      "source": [
        "# Try a dummy forward pass to see what shapes our data is\n",
        "dummy_x = torch.rand(size=(1, 28, 28)).unsqueeze(dim=0).to(device)\n",
        "# dummy_x.shape\n",
        "model(dummy_x)"
      ],
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/"
        },
        "id": "AAd-DhBIMQ_N",
        "outputId": "aa33c6a0-ed54-48f0-a46b-1aa8a0742376"
      },
      "execution_count": 19,
      "outputs": [
        {
          "output_type": "execute_result",
          "data": {
            "text/plain": [
              "tensor([[ 0.0169, -0.0080,  0.0213, -0.0463, -0.0163,  0.0157, -0.0268,  0.0421,\n",
              "         -0.0124, -0.0211]], device='cuda:0', grad_fn=<AddmmBackward0>)"
            ]
          },
          "metadata": {},
          "execution_count": 19
        }
      ]
    },
    {
      "cell_type": "code",
      "source": [
        "dummy_x_2 = torch.rand(size=([1, 10, 7, 7]))\n",
        "dummy_x_2.shape"
      ],
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/"
        },
        "id": "xw4nqMCVN_Jr",
        "outputId": "071ee69e-bc24-403f-c864-84a78f9c7a76"
      },
      "execution_count": 20,
      "outputs": [
        {
          "output_type": "execute_result",
          "data": {
            "text/plain": [
              "torch.Size([1, 10, 7, 7])"
            ]
          },
          "metadata": {},
          "execution_count": 20
        }
      ]
    },
    {
      "cell_type": "code",
      "source": [
        "flatten_layer = nn.Flatten()\n",
        "flatten_layer(dummy_x_2).shape"
      ],
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/"
        },
        "id": "9omFrrBCODLL",
        "outputId": "2cab7078-7338-431f-f1de-b32dd8859ffd"
      },
      "execution_count": 21,
      "outputs": [
        {
          "output_type": "execute_result",
          "data": {
            "text/plain": [
              "torch.Size([1, 490])"
            ]
          },
          "metadata": {},
          "execution_count": 21
        }
      ]
    },
    {
      "cell_type": "markdown",
      "source": [
        "## 9. Train the model you built in exercise 8. for 5 epochs on CPU and GPU and see how long it takes on each."
      ],
      "metadata": {
        "id": "sf_3zUr7xlhy"
      }
    },
    {
      "cell_type": "code",
      "source": [
        "%%time\n",
        "from tqdm.auto import tqdm \n",
        "\n",
        "# Train on CPU\n",
        "model_cpu = MNIST_model(input_shape=1,\n",
        "                        hidden_units=10,\n",
        "                        output_shape=10).to(\"cpu\")\n",
        "\n",
        "# Create a loss function and optimizer\n",
        "loss_fn = nn.CrossEntropyLoss()\n",
        "optimizer = torch.optim.SGD(model_cpu.parameters(), lr=0.1)\n",
        "\n",
        "### Training loop\n",
        "epochs = 5\n",
        "for epoch in tqdm(range(epochs)):\n",
        "  train_loss = 0\n",
        "  for batch, (X, y) in enumerate(train_dataloader):\n",
        "    model_cpu.train()\n",
        "\n",
        "    # Put data on CPU\n",
        "    X, y = X.to(\"cpu\"), y.to(\"cpu\")\n",
        "\n",
        "    # Forward pass\n",
        "    y_pred = model_cpu(X)\n",
        "\n",
        "    # Loss calculation\n",
        "    loss = loss_fn(y_pred, y)\n",
        "    train_loss += loss\n",
        "\n",
        "    # Optimizer zero grad\n",
        "    optimizer.zero_grad()\n",
        "\n",
        "    # Loss backward\n",
        "    loss.backward()\n",
        "\n",
        "    # Step the optimizer\n",
        "    optimizer.step()\n",
        "  \n",
        "  # Adjust train loss for number of batches\n",
        "  train_loss /= len(train_dataloader)\n",
        "\n",
        "  ### Testing loop\n",
        "  test_loss_total = 0\n",
        "\n",
        "  # Put model in eval mode \n",
        "  model_cpu.eval()\n",
        "\n",
        "  # Turn on inference mode\n",
        "  with torch.inference_mode():\n",
        "    for batch, (X_test, y_test) in enumerate(test_dataloader):\n",
        "      # Make sure test data on CPU\n",
        "      X_test, y_test = X_test.to(\"cpu\"), y_test.to(\"cpu\")\n",
        "      test_pred = model_cpu(X_test)\n",
        "      test_loss = loss_fn(test_pred, y_test)\n",
        "\n",
        "      test_loss_total += test_loss\n",
        "    \n",
        "    test_loss_total /= len(test_dataloader)\n",
        "  \n",
        "  # Print out what's happening\n",
        "  print(f\"Epoch: {epoch} | Loss: {train_loss:.3f} | Test loss: {test_loss_total:.3f}\")"
      ],
      "metadata": {
        "id": "j1cCWCIfyB7h",
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 173,
          "referenced_widgets": [
            "f2fb9f5dfbe144caaeff6d95f3ea24b1",
            "bd43d96dea8f4ff2a71037d5c594845d",
            "5171c1cc4aca4737b46b99ed9a7ab9da",
            "00b8d54af39a4ba4bd9e488ecaa37772",
            "49a6ff8d5ce347528577eb3896b425d9",
            "9fbb80c57c814ab6bf0205ba1b1a71e9",
            "4cc05625e0834781b9f65bd31d2f5fb0",
            "faa2697a0c274661886e031ab42e0a04",
            "9cec1b0eee41441899c4d7fb743fa33e",
            "3aa64a1f9a4f4f38b710d2a28b26c19f",
            "a35d16d75b5b4f27b26828af2154a3d5"
          ]
        },
        "outputId": "113b228a-a192-44b0-98b9-3d15ad060beb"
      },
      "execution_count": 22,
      "outputs": [
        {
          "output_type": "display_data",
          "data": {
            "text/plain": [
              "  0%|          | 0/5 [00:00<?, ?it/s]"
            ],
            "application/vnd.jupyter.widget-view+json": {
              "version_major": 2,
              "version_minor": 0,
              "model_id": "f2fb9f5dfbe144caaeff6d95f3ea24b1"
            }
          },
          "metadata": {}
        },
        {
          "output_type": "stream",
          "name": "stdout",
          "text": [
            "Epoch: 0 | Loss: 0.367 | Test loss: 0.062\n",
            "Epoch: 1 | Loss: 0.069 | Test loss: 0.059\n",
            "Epoch: 2 | Loss: 0.053 | Test loss: 0.042\n",
            "Epoch: 3 | Loss: 0.044 | Test loss: 0.035\n",
            "Epoch: 4 | Loss: 0.039 | Test loss: 0.039\n",
            "CPU times: user 3min 18s, sys: 3.32 s, total: 3min 21s\n",
            "Wall time: 3min 28s\n"
          ]
        }
      ]
    },
    {
      "cell_type": "code",
      "source": [
        "%%time\n",
        "from tqdm.auto import tqdm \n",
        "\n",
        "device = \"cuda\" if torch.cuda.is_available() else \"cpu\"\n",
        "\n",
        "# Train on GPU\n",
        "model_gpu = MNIST_model(input_shape=1,\n",
        "                        hidden_units=10,\n",
        "                        output_shape=10).to(device)\n",
        "\n",
        "# Create a loss function and optimizer\n",
        "loss_fn = nn.CrossEntropyLoss()\n",
        "optimizer = torch.optim.SGD(model_gpu.parameters(), lr=0.1)\n",
        "\n",
        "# Training loop\n",
        "epochs = 5\n",
        "for epoch in tqdm(range(epochs)):\n",
        "  train_loss = 0\n",
        "  model_gpu.train()\n",
        "  for batch, (X, y) in enumerate(train_dataloader):\n",
        "    # Put data on target device\n",
        "    X, y = X.to(device), y.to(device)\n",
        "\n",
        "    # Forward pass\n",
        "    y_pred = model_gpu(X)\n",
        "\n",
        "    # Loss calculation\n",
        "    loss = loss_fn(y_pred, y)\n",
        "    train_loss += loss\n",
        "\n",
        "    # Optimizer zero grad\n",
        "    optimizer.zero_grad()\n",
        "\n",
        "    # Loss backward\n",
        "    loss.backward()\n",
        "\n",
        "    # Step the optimizer\n",
        "    optimizer.step()\n",
        "  \n",
        "  # Adjust train loss to number of batches\n",
        "  train_loss /= len(train_dataloader)\n",
        "\n",
        "  ### Testing loop\n",
        "  test_loss_total = 0\n",
        "  # Put model in eval mode and turn on inference mode\n",
        "  model_gpu.eval()\n",
        "  with torch.inference_mode():\n",
        "    for batch, (X_test, y_test) in enumerate(test_dataloader):\n",
        "      # Make sure test data on target device\n",
        "      X_test, y_test = X_test.to(device), y_test.to(device)\n",
        "      \n",
        "      test_pred = model_gpu(X_test)\n",
        "      test_loss = loss_fn(test_pred, y_test)\n",
        "\n",
        "      test_loss_total += test_loss\n",
        "\n",
        "    # Adjust test loss total for number of batches\n",
        "    test_loss_total /= len(test_dataloader)\n",
        "  \n",
        "  # Print out what's happening\n",
        "  print(f\"Epoch: {epoch} | Loss: {train_loss:.3f} | Test loss: {test_loss_total:.3f}\")"
      ],
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 173,
          "referenced_widgets": [
            "ac4f9033337a425ab05f963a300af10a",
            "4c2b4be7117d4043b56d6b4e05251d9e",
            "800977f38e5e45f9bb7b8f43fe78ea9c",
            "2f37f541c8f949eab60200d46fbc8b05",
            "8695077763e749559af9cec55f651006",
            "1853564527f045d7bcb510f62b45489f",
            "adf4f0bbf7d44ae3a13b627bd754e421",
            "3913cd7ccbfa4fa29305a7a34c0a6846",
            "61814ca3a0704d0d84cededc512f96a4",
            "17ba6b57f29a42f9a525db0bbe3bdb68",
            "d29972a957884ef0bf2d4ac167eb2218"
          ]
        },
        "id": "0IzzuVLkPE9j",
        "outputId": "15badd9e-676a-4ba4-d472-29fa605cda95"
      },
      "execution_count": 23,
      "outputs": [
        {
          "output_type": "display_data",
          "data": {
            "text/plain": [
              "  0%|          | 0/5 [00:00<?, ?it/s]"
            ],
            "application/vnd.jupyter.widget-view+json": {
              "version_major": 2,
              "version_minor": 0,
              "model_id": "ac4f9033337a425ab05f963a300af10a"
            }
          },
          "metadata": {}
        },
        {
          "output_type": "stream",
          "name": "stdout",
          "text": [
            "Epoch: 0 | Loss: 0.266 | Test loss: 0.072\n",
            "Epoch: 1 | Loss: 0.070 | Test loss: 0.069\n",
            "Epoch: 2 | Loss: 0.054 | Test loss: 0.055\n",
            "Epoch: 3 | Loss: 0.047 | Test loss: 0.046\n",
            "Epoch: 4 | Loss: 0.042 | Test loss: 0.044\n",
            "CPU times: user 43.4 s, sys: 516 ms, total: 43.9 s\n",
            "Wall time: 43.7 s\n"
          ]
        }
      ]
    },
    {
      "cell_type": "markdown",
      "source": [
        "## 10. Make predictions using your trained model and visualize at least 5 of them comparing the prediciton to the target label."
      ],
      "metadata": {
        "id": "w1CsHhPpxp1w"
      }
    },
    {
      "cell_type": "code",
      "source": [
        "# Make predictions with the trained model\n",
        "plt.imshow(test_data[0][0].squeeze(), cmap=\"gray\")"
      ],
      "metadata": {
        "id": "iVyM5cC6yBkF",
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 282
        },
        "outputId": "17f9a80f-1b39-433b-ac33-ca9b9b38a787"
      },
      "execution_count": 24,
      "outputs": [
        {
          "output_type": "execute_result",
          "data": {
            "text/plain": [
              "<matplotlib.image.AxesImage at 0x7f77f0022190>"
            ]
          },
          "metadata": {},
          "execution_count": 24
        },
        {
          "output_type": "display_data",
          "data": {
            "text/plain": [
              "<Figure size 432x288 with 1 Axes>"
            ],
            "image/png": "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\n"
          },
          "metadata": {
            "needs_background": "light"
          }
        }
      ]
    },
    {
      "cell_type": "code",
      "source": [
        "# Logits -> Prediction probabilities -> Prediction labels\n",
        "model_pred_logits = model_gpu(test_data[0][0].unsqueeze(dim=0).to(device)) # make sure image is right shape + on right device\n",
        "model_pred_probs = torch.softmax(model_pred_logits, dim=1)\n",
        "model_pred_label = torch.argmax(model_pred_probs, dim=1)\n",
        "model_pred_label"
      ],
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/"
        },
        "id": "NGide8hMWP17",
        "outputId": "c68b7926-f691-4d46-b3a6-5b8fd3b5b587"
      },
      "execution_count": 25,
      "outputs": [
        {
          "output_type": "execute_result",
          "data": {
            "text/plain": [
              "tensor([7], device='cuda:0')"
            ]
          },
          "metadata": {},
          "execution_count": 25
        }
      ]
    },
    {
      "cell_type": "code",
      "source": [
        "num_to_plot = 5 \n",
        "for i in range(num_to_plot):\n",
        "  # Get image and labels from the test data\n",
        "  img = test_data[i][0]\n",
        "  label = test_data[i][1]\n",
        "\n",
        "  # Make prediction on image\n",
        "  model_pred_logits = model_gpu(img.unsqueeze(dim=0).to(device))\n",
        "  model_pred_probs = torch.softmax(model_pred_logits, dim=1)\n",
        "  model_pred_label = torch.argmax(model_pred_probs, dim=1)\n",
        "\n",
        "  # Plot the image and prediction\n",
        "  plt.figure()\n",
        "  plt.imshow(img.squeeze(), cmap=\"gray\")\n",
        "  plt.title(f\"Truth: {label} | Pred: {model_pred_label.cpu().item()}\") \n",
        "  plt.axis(False);"
      ],
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 1000
        },
        "id": "jNCPUtO_Wuj5",
        "outputId": "f5e34b91-c746-4cf4-af5f-7231e9963209"
      },
      "execution_count": 26,
      "outputs": [
        {
          "output_type": "display_data",
          "data": {
            "text/plain": [
              "<Figure size 432x288 with 1 Axes>"
            ],
            "image/png": "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\n"
          },
          "metadata": {
            "needs_background": "light"
          }
        },
        {
          "output_type": "display_data",
          "data": {
            "text/plain": [
              "<Figure size 432x288 with 1 Axes>"
            ],
            "image/png": "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\n"
          },
          "metadata": {
            "needs_background": "light"
          }
        },
        {
          "output_type": "display_data",
          "data": {
            "text/plain": [
              "<Figure size 432x288 with 1 Axes>"
            ],
            "image/png": "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\n"
          },
          "metadata": {
            "needs_background": "light"
          }
        },
        {
          "output_type": "display_data",
          "data": {
            "text/plain": [
              "<Figure size 432x288 with 1 Axes>"
            ],
            "image/png": "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\n"
          },
          "metadata": {
            "needs_background": "light"
          }
        },
        {
          "output_type": "display_data",
          "data": {
            "text/plain": [
              "<Figure size 432x288 with 1 Axes>"
            ],
            "image/png": "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\n"
          },
          "metadata": {
            "needs_background": "light"
          }
        }
      ]
    },
    {
      "cell_type": "markdown",
      "source": [
        "## 11. Plot a confusion matrix comparing your model's predictions to the truth labels."
      ],
      "metadata": {
        "id": "qQwzqlBWxrpG"
      }
    },
    {
      "cell_type": "code",
      "source": [
        "# See if torchmetrics exists, if not, install it\n",
        "try:\n",
        "    import torchmetrics, mlxtend\n",
        "    print(f\"mlxtend version: {mlxtend.__version__}\")\n",
        "    assert int(mlxtend.__version__.split(\".\")[1]) >= 19, \"mlxtend verison should be 0.19.0 or higher\"\n",
        "except:\n",
        "    !pip install -q torchmetrics -U mlxtend # <- Note: If you're using Google Colab, this may require restarting the runtime\n",
        "    import torchmetrics, mlxtend\n",
        "    print(f\"mlxtend version: {mlxtend.__version__}\")"
      ],
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/"
        },
        "id": "CTIlKRqqYF02",
        "outputId": "6d0a28c1-ed59-4305-c47c-67fc0cc27192"
      },
      "execution_count": 27,
      "outputs": [
        {
          "output_type": "stream",
          "name": "stdout",
          "text": [
            "mlxtend version: 0.19.0\n"
          ]
        }
      ]
    },
    {
      "cell_type": "code",
      "source": [
        "# Import mlxtend upgraded version\n",
        "import mlxtend \n",
        "print(mlxtend.__version__)\n",
        "assert int(mlxtend.__version__.split(\".\")[1]) >= 19 # should be version 0.19.0 or higher"
      ],
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/"
        },
        "id": "SqYUDscuYGSd",
        "outputId": "4cf2b146-49bf-446e-e762-0e807696665a"
      },
      "execution_count": 28,
      "outputs": [
        {
          "output_type": "stream",
          "name": "stdout",
          "text": [
            "0.19.0\n"
          ]
        }
      ]
    },
    {
      "cell_type": "code",
      "source": [
        "# Make predictions across all test data\n",
        "from tqdm.auto import tqdm\n",
        "model_gpu.eval()\n",
        "y_preds = []\n",
        "with torch.inference_mode():\n",
        "  for batch, (X, y) in tqdm(enumerate(test_dataloader)):\n",
        "    # Make sure data on right device\n",
        "    X, y = X.to(device), y.to(device)\n",
        "    # Forward pass\n",
        "    y_pred_logits = model_gpu(X)\n",
        "    # Logits -> Pred probs -> Pred label\n",
        "    y_pred_labels = torch.argmax(torch.softmax(y_pred_logits, dim=1), dim=1)\n",
        "    # Append the labels to the preds list\n",
        "    y_preds.append(y_pred_labels)\n",
        "  y_preds=torch.cat(y_preds).cpu()\n",
        "len(y_preds) "
      ],
      "metadata": {
        "id": "8kJO6BqAyBEc",
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 67,
          "referenced_widgets": [
            "fd9be8a0ee5244fa833009d0c531a643",
            "59a28ded11914e88a8d54c8bac21e3a4",
            "6fb3df7d7bec4e92abdf872d4cc50f9c",
            "194f0886026b47b4bc1855151ad97034",
            "b5931a6b638d408f93255db7cd0283bf",
            "11278b21b19f4ec4b163313b42a7c9ef",
            "4bea2e3d735e4c569fc5026bf0e36b9b",
            "f219941b11dd42afba6e5d9fb9be7c4b",
            "829d30f9c02f46358bcc78768fabc3c5",
            "2e97b9ce8eca4a4d8d1b68a5c19fbe11",
            "14ae9f7185124afcab1ca2e38ecbd81b"
          ]
        },
        "outputId": "1cdebb39-79ff-4114-bf92-c6181f2d15c9"
      },
      "execution_count": 29,
      "outputs": [
        {
          "output_type": "display_data",
          "data": {
            "text/plain": [
              "0it [00:00, ?it/s]"
            ],
            "application/vnd.jupyter.widget-view+json": {
              "version_major": 2,
              "version_minor": 0,
              "model_id": "fd9be8a0ee5244fa833009d0c531a643"
            }
          },
          "metadata": {}
        },
        {
          "output_type": "execute_result",
          "data": {
            "text/plain": [
              "10000"
            ]
          },
          "metadata": {},
          "execution_count": 29
        }
      ]
    },
    {
      "cell_type": "code",
      "source": [
        "test_data.targets[:10], y_preds[:10]"
      ],
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/"
        },
        "id": "HMs7XPLTZBV4",
        "outputId": "a30674af-3656-47c2-dd18-123533718bd2"
      },
      "execution_count": 30,
      "outputs": [
        {
          "output_type": "execute_result",
          "data": {
            "text/plain": [
              "(tensor([7, 2, 1, 0, 4, 1, 4, 9, 5, 9]),\n",
              " tensor([7, 2, 1, 0, 4, 1, 4, 9, 5, 9]))"
            ]
          },
          "metadata": {},
          "execution_count": 30
        }
      ]
    },
    {
      "cell_type": "code",
      "source": [
        "from torchmetrics import ConfusionMatrix\n",
        "from mlxtend.plotting import plot_confusion_matrix\n",
        "\n",
        "# Setup confusion matrix \n",
        "confmat = ConfusionMatrix(task=\"multiclass\", num_classes=len(class_names))\n",
        "confmat_tensor = confmat(preds=y_preds,\n",
        "                         target=test_data.targets)\n",
        "\n",
        "# Plot the confusion matrix\n",
        "fix, ax = plot_confusion_matrix(\n",
        "    conf_mat=confmat_tensor.numpy(),\n",
        "    class_names=class_names,\n",
        "    figsize=(10, 7)\n",
        ")"
      ],
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 472
        },
        "id": "7lK_v2JyZOOG",
        "outputId": "fa17d9a7-dfbc-4485-fb95-ee27d6fb857c"
      },
      "execution_count": 31,
      "outputs": [
        {
          "output_type": "display_data",
          "data": {
            "text/plain": [
              "<Figure size 720x504 with 1 Axes>"
            ],
            "image/png": "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\n"
          },
          "metadata": {
            "needs_background": "light"
          }
        }
      ]
    },
    {
      "cell_type": "markdown",
      "source": [
        "## 12. Create a random tensor of shape `[1, 3, 64, 64]` and pass it through a `nn.Conv2d()` layer with various hyperparameter settings (these can be any settings you choose), what do you notice if the `kernel_size` parameter goes up and down?"
      ],
      "metadata": {
        "id": "lj6bDhoWxt2y"
      }
    },
    {
      "cell_type": "code",
      "source": [
        "random_tensor = torch.rand([1, 3, 64, 64])\n",
        "random_tensor.shape"
      ],
      "metadata": {
        "id": "dXM4LOZpyA1e",
        "colab": {
          "base_uri": "https://localhost:8080/"
        },
        "outputId": "a213063d-3534-4200-9f3c-6b49a9143186"
      },
      "execution_count": 32,
      "outputs": [
        {
          "output_type": "execute_result",
          "data": {
            "text/plain": [
              "torch.Size([1, 3, 64, 64])"
            ]
          },
          "metadata": {},
          "execution_count": 32
        }
      ]
    },
    {
      "cell_type": "code",
      "source": [
        "conv_layer = nn.Conv2d(in_channels=3,\n",
        "                       out_channels=64,\n",
        "                       kernel_size=3,\n",
        "                       stride=2,\n",
        "                       padding=1)\n",
        "\n",
        "print(f\"Random tensor original shape: {random_tensor.shape}\")\n",
        "random_tensor_through_conv_layer = conv_layer(random_tensor)\n",
        "print(f\"Random tensor through conv layer shape: {random_tensor_through_conv_layer.shape}\")"
      ],
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/"
        },
        "id": "PcCZ5hLAaS_t",
        "outputId": "bd950d3c-557e-43b1-cd56-70214bef8d50"
      },
      "execution_count": 33,
      "outputs": [
        {
          "output_type": "stream",
          "name": "stdout",
          "text": [
            "Random tensor original shape: torch.Size([1, 3, 64, 64])\n",
            "Random tensor through conv layer shape: torch.Size([1, 64, 32, 32])\n"
          ]
        }
      ]
    },
    {
      "cell_type": "markdown",
      "source": [
        "## 13. Use a model similar to the trained `model_2` from notebook 03 to make predictions on the test [`torchvision.datasets.FashionMNIST`](https://pytorch.org/vision/main/generated/torchvision.datasets.FashionMNIST.html) dataset. \n",
        "* Then plot some predictions where the model was wrong alongside what the label of the image should've been. \n",
        "* After visualing these predictions do you think it's more of a modelling error or a data error? \n",
        "* As in, could the model do better or are the labels of the data too close to each other (e.g. a \"Shirt\" label is too close to \"T-shirt/top\")?"
      ],
      "metadata": {
        "id": "VHS20cNTxwSi"
      }
    },
    {
      "cell_type": "code",
      "source": [
        "# Download FashionMNIST train & test\n",
        "from torchvision import datasets\n",
        "from torchvision import transforms\n",
        "\n",
        "fashion_mnist_train = datasets.FashionMNIST(root=\".\",\n",
        "                                            download=True,\n",
        "                                            train=True,\n",
        "                                            transform=transforms.ToTensor())\n",
        "\n",
        "fashion_mnist_test = datasets.FashionMNIST(root=\".\",\n",
        "                                           train=False,\n",
        "                                           download=True,\n",
        "                                           transform=transforms.ToTensor())\n",
        "\n",
        "len(fashion_mnist_train), len(fashion_mnist_test)"
      ],
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/"
        },
        "id": "ReWkG-WgRsUy",
        "outputId": "c2e76512-bf34-43ca-952c-d22b71433130"
      },
      "execution_count": 34,
      "outputs": [
        {
          "output_type": "execute_result",
          "data": {
            "text/plain": [
              "(60000, 10000)"
            ]
          },
          "metadata": {},
          "execution_count": 34
        }
      ]
    },
    {
      "cell_type": "code",
      "source": [
        "# Get the class names of the Fashion MNIST dataset\n",
        "fashion_mnist_class_names = fashion_mnist_train.classes\n",
        "fashion_mnist_class_names"
      ],
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/"
        },
        "id": "l3_dnddgTg7a",
        "outputId": "3a5b43b0-54f8-482f-d540-45a6b9fa9918"
      },
      "execution_count": 35,
      "outputs": [
        {
          "output_type": "execute_result",
          "data": {
            "text/plain": [
              "['T-shirt/top',\n",
              " 'Trouser',\n",
              " 'Pullover',\n",
              " 'Dress',\n",
              " 'Coat',\n",
              " 'Sandal',\n",
              " 'Shirt',\n",
              " 'Sneaker',\n",
              " 'Bag',\n",
              " 'Ankle boot']"
            ]
          },
          "metadata": {},
          "execution_count": 35
        }
      ]
    },
    {
      "cell_type": "code",
      "source": [
        "# Turn FashionMNIST datasets into dataloaders\n",
        "from torch.utils.data import DataLoader\n",
        "\n",
        "fashion_mnist_train_dataloader = DataLoader(fashion_mnist_train,\n",
        "                                            batch_size=32,\n",
        "                                            shuffle=True)\n",
        "\n",
        "fashion_mnist_test_dataloader = DataLoader(fashion_mnist_test,\n",
        "                                           batch_size=32,\n",
        "                                           shuffle=False)\n",
        "\n",
        "len(fashion_mnist_train_dataloader), len(fashion_mnist_test_dataloader)"
      ],
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/"
        },
        "id": "xc_QU6yBSCl_",
        "outputId": "adf3c118-0ab3-4526-f450-067ee85ba944"
      },
      "execution_count": 36,
      "outputs": [
        {
          "output_type": "execute_result",
          "data": {
            "text/plain": [
              "(1875, 313)"
            ]
          },
          "metadata": {},
          "execution_count": 36
        }
      ]
    },
    {
      "cell_type": "code",
      "source": [
        "# model_2 is the same architecture as MNIST_model\n",
        "model_2 = MNIST_model(input_shape=1,\n",
        "                      hidden_units=10,\n",
        "                      output_shape=10).to(device)\n",
        "model_2"
      ],
      "metadata": {
        "id": "8b3ksFYFx8uc",
        "colab": {
          "base_uri": "https://localhost:8080/"
        },
        "outputId": "40f2c9e0-3480-45da-b25b-eece397d56b4"
      },
      "execution_count": 37,
      "outputs": [
        {
          "output_type": "execute_result",
          "data": {
            "text/plain": [
              "MNIST_model(\n",
              "  (conv_block_1): Sequential(\n",
              "    (0): Conv2d(1, 10, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))\n",
              "    (1): ReLU()\n",
              "    (2): Conv2d(10, 10, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))\n",
              "    (3): ReLU()\n",
              "    (4): MaxPool2d(kernel_size=2, stride=2, padding=0, dilation=1, ceil_mode=False)\n",
              "  )\n",
              "  (conv_block_2): Sequential(\n",
              "    (0): Conv2d(10, 10, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))\n",
              "    (1): ReLU()\n",
              "    (2): Conv2d(10, 10, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))\n",
              "    (3): ReLU()\n",
              "    (4): MaxPool2d(kernel_size=2, stride=2, padding=0, dilation=1, ceil_mode=False)\n",
              "  )\n",
              "  (classifier): Sequential(\n",
              "    (0): Flatten(start_dim=1, end_dim=-1)\n",
              "    (1): Linear(in_features=490, out_features=10, bias=True)\n",
              "  )\n",
              ")"
            ]
          },
          "metadata": {},
          "execution_count": 37
        }
      ]
    },
    {
      "cell_type": "code",
      "source": [
        "# Setup loss and optimizer\n",
        "from torch import nn\n",
        "loss_fn = nn.CrossEntropyLoss()\n",
        "optimizer = torch.optim.SGD(model_2.parameters(), lr=0.01)"
      ],
      "metadata": {
        "id": "Tu_-5U5nRrew"
      },
      "execution_count": 38,
      "outputs": []
    },
    {
      "cell_type": "code",
      "source": [
        "# Setup metrics\n",
        "from tqdm.auto import tqdm\n",
        "from torchmetrics import Accuracy\n",
        "\n",
        "acc_fn = Accuracy(task = 'multiclass', num_classes=len(fashion_mnist_class_names)).to(device) \n",
        "\n",
        "# Setup training/testing loop\n",
        "epochs = 5\n",
        "for epoch in tqdm(range(epochs)):\n",
        "  train_loss, test_loss_total = 0, 0\n",
        "  train_acc, test_acc = 0, 0 \n",
        "\n",
        "  ### Training\n",
        "  model_2.train()\n",
        "  for batch, (X_train, y_train) in enumerate(fashion_mnist_train_dataloader):\n",
        "    X_train, y_train = X_train.to(device), y_train.to(device)\n",
        "\n",
        "    # Forward pass and loss\n",
        "    y_pred = model_2(X_train)\n",
        "    loss = loss_fn(y_pred, y_train)\n",
        "    train_loss += loss\n",
        "    train_acc += acc_fn(y_pred, y_train)\n",
        "\n",
        "    # Backprop and gradient descent\n",
        "    optimizer.zero_grad()\n",
        "    loss.backward() \n",
        "    optimizer.step()\n",
        "\n",
        "  # Adjust the loss/acc (find the loss/acc per epoch)\n",
        "  train_loss /= len(fashion_mnist_train_dataloader)\n",
        "  train_acc /= len(fashion_mnist_train_dataloader)\n",
        "\n",
        "  ### Testing\n",
        "  model_2.eval()\n",
        "  with torch.inference_mode():\n",
        "    for batch, (X_test, y_test) in enumerate(fashion_mnist_test_dataloader):\n",
        "      X_test, y_test = X_test.to(device), y_test.to(device)\n",
        "\n",
        "      # Forward pass and loss\n",
        "      y_pred_test = model_2(X_test)\n",
        "      test_loss = loss_fn(y_pred_test, y_test)\n",
        "      test_loss_total += test_loss\n",
        "\n",
        "      test_acc += acc_fn(y_pred_test, y_test)\n",
        "  \n",
        "    # Adjust the loss/acc (find the loss/acc per epoch)\n",
        "    test_loss /= len(fashion_mnist_test_dataloader)\n",
        "    test_acc /= len(fashion_mnist_test_dataloader)\n",
        "    \n",
        "  # Print out what's happening\n",
        "  print(f\"Epoch: {epoch} | Train loss: {train_loss:.3f} | Train acc: {train_acc:.2f} | Test loss: {test_loss_total:.3f} | Test acc: {test_acc:.2f}\")"
      ],
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 138,
          "referenced_widgets": [
            "a74d331cd4b24285a55e5a3705f1b68f",
            "e24d41fab6ee49e09997503870813e0a",
            "561e8d9c749b4be0a126db44e263145b",
            "8241d895e996490f9e40f2393f3ee7f9",
            "f9b11b9712c3423784642b7a3597e667",
            "c9b96de5d3b94ed8ae22a956ba81ed23",
            "1a802f281ef24b9ca5949ff3106b88ef",
            "d082717fb8e94afe8a3c129c9b57d3ce",
            "ed1fe3209f9440a38bcfa77b89f5c8ad",
            "430e20b56d344c1d9942e4b50b77be77",
            "c7374c0a769a4dac96ace3670e6800e4"
          ]
        },
        "id": "jZfVpOXDS89v",
        "outputId": "12dc664e-535e-4e81-9e28-5b606ee77c11"
      },
      "execution_count": 39,
      "outputs": [
        {
          "output_type": "display_data",
          "data": {
            "text/plain": [
              "  0%|          | 0/5 [00:00<?, ?it/s]"
            ],
            "application/vnd.jupyter.widget-view+json": {
              "version_major": 2,
              "version_minor": 0,
              "model_id": "a74d331cd4b24285a55e5a3705f1b68f"
            }
          },
          "metadata": {}
        },
        {
          "output_type": "stream",
          "name": "stdout",
          "text": [
            "Epoch: 0 | Train loss: 1.186 | Train acc: 0.57 | Test loss: 197.707 | Test acc: 0.77\n",
            "Epoch: 1 | Train loss: 0.543 | Train acc: 0.80 | Test loss: 152.445 | Test acc: 0.83\n",
            "Epoch: 2 | Train loss: 0.454 | Train acc: 0.84 | Test loss: 141.563 | Test acc: 0.84\n",
            "Epoch: 3 | Train loss: 0.411 | Train acc: 0.85 | Test loss: 128.963 | Test acc: 0.86\n",
            "Epoch: 4 | Train loss: 0.386 | Train acc: 0.86 | Test loss: 126.913 | Test acc: 0.86\n"
          ]
        }
      ]
    },
    {
      "cell_type": "code",
      "source": [
        "# Make predictions with trained model_2\n",
        "test_preds = []\n",
        "model_2.eval()\n",
        "with torch.inference_mode():\n",
        "  for X_test, y_test in tqdm(fashion_mnist_test_dataloader):\n",
        "    y_logits = model_2(X_test.to(device))\n",
        "    y_pred_probs = torch.softmax(y_logits, dim=1)\n",
        "    y_pred_labels = torch.argmax(y_pred_probs, dim=1)\n",
        "    test_preds.append(y_pred_labels)\n",
        "test_preds = torch.cat(test_preds).cpu() # matplotlib likes CPU\n",
        "test_preds[:10], len(test_preds)    "
      ],
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 67,
          "referenced_widgets": [
            "671a67e7a2a94007bfb337e0a3f20ca7",
            "61e487bf20834fbb889f25cb5d46e311",
            "139588c346c042f8a5f67722166cd6b7",
            "1820ad9809494ec1a755344245e91dda",
            "6050da7f27f747e58ee98250544bad03",
            "091a2fc4fc9b4e9c8e683d2a04f01073",
            "637a295bd69f412788f6073065a18934",
            "e6a2483643c3481ea529538b8c86b8f3",
            "b452afd37618427a801b35a9a6b0b310",
            "f88e19b433254b69a26a08378073a6ca",
            "198d76ef4b0c4cc7809b3a99b969f2f7"
          ]
        },
        "id": "-fc0k8R6TG7d",
        "outputId": "02ff70d1-e56e-41f4-94d5-66648d8459fd"
      },
      "execution_count": 40,
      "outputs": [
        {
          "output_type": "display_data",
          "data": {
            "text/plain": [
              "  0%|          | 0/313 [00:00<?, ?it/s]"
            ],
            "application/vnd.jupyter.widget-view+json": {
              "version_major": 2,
              "version_minor": 0,
              "model_id": "671a67e7a2a94007bfb337e0a3f20ca7"
            }
          },
          "metadata": {}
        },
        {
          "output_type": "execute_result",
          "data": {
            "text/plain": [
              "(tensor([9, 2, 1, 1, 6, 1, 4, 6, 5, 7]), 10000)"
            ]
          },
          "metadata": {},
          "execution_count": 40
        }
      ]
    },
    {
      "cell_type": "code",
      "source": [
        "# Get wrong prediction indexes\n",
        "import numpy as np\n",
        "wrong_pred_indexes = np.where(test_preds != fashion_mnist_test.targets)[0]\n",
        "len(wrong_pred_indexes)"
      ],
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/"
        },
        "id": "A17UvsvHW6Mf",
        "outputId": "e9acdb76-5439-4a10-9e86-2aa186228e83"
      },
      "execution_count": 41,
      "outputs": [
        {
          "output_type": "execute_result",
          "data": {
            "text/plain": [
              "1425"
            ]
          },
          "metadata": {},
          "execution_count": 41
        }
      ]
    },
    {
      "cell_type": "code",
      "source": [
        "# Select random 9 wrong predictions and plot them\n",
        "import random\n",
        "random_selection = random.sample(list(wrong_pred_indexes), k=9)\n",
        "\n",
        "plt.figure(figsize=(10, 10))\n",
        "for i, idx in enumerate(random_selection):\n",
        "  # Get true and pred labels\n",
        "  true_label = fashion_mnist_class_names[fashion_mnist_test[idx][1]]\n",
        "  pred_label = fashion_mnist_class_names[test_preds[idx]]\n",
        "\n",
        "  # Plot the wrong prediction with its original label\n",
        "  plt.subplot(3, 3, i+1)\n",
        "  plt.imshow(fashion_mnist_test[idx][0].squeeze(), cmap=\"gray\")\n",
        "  plt.title(f\"True: {true_label} | Pred: {pred_label}\", c=\"r\")\n",
        "  plt.axis(False);"
      ],
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 591
        },
        "id": "AW5qlA7gXMrI",
        "outputId": "572d5356-68c1-44a3-e3a4-4e20327cff52"
      },
      "execution_count": 42,
      "outputs": [
        {
          "output_type": "display_data",
          "data": {
            "text/plain": [
              "<Figure size 720x720 with 9 Axes>"
            ],
            "image/png": "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a/e+jequ31BV6RPcWQIAACjBYAkAAKAEgyUAAIASDJYAAABKMFgCAAAo0WG/s9ToWQ6Rgw8+uBD793//d7fsAQcc4MYjTzzxRCG2ZMkSt+yee+7pxocOHVqIRe/hK6+84sZfeuklN37hhRe68e6IzJ/2M3r06ELs2GOPdcuuXLnSjb/44otu/Mtf/nIhtn79erdsr1693LiXbXTuuee6ZT/ykY+48Shz9I9/LC5uvmXLFrdso6NPxHbddVc3Hp1D28NZZ53lxm+6qfW67XHGc+SII44oxC666CK37He+851K264iyqirmiHYUciGAwAAaCcMlgAAAEowWAIAACjBYAkAAKBEhy130l15k0gXLFjgln344Yfd+MyZM934oYceWoidffbZbtlDDjnEjX/ve98rxH7/+9+7ZSdNmuTGvZ/Tl6R+/foVYmvXrnXLovvylgeRpHe+851u3Jvk+vzzz7tloyVzovJLly4txM455xy37G67+aerN77xjYXYpk2b3LIPPvigG4+WY3nve99biEXngz/84Q9uPKoLGkfVidwDBgwoxE4//XS3bJQgNGTIEDc+Z86cQiyaKL1582Y37vW3yy+/3C0bTfz+xCc+4cZ//etfu3FPNJHbm1DfkZPp2wN3lgAAAEowWAIAACjBYAkAAKAEgyUAAIASDJYAAABK7LTLnXjZDJKfuTBu3Di37IoVK9z4YYcd5sb/+te/FmKnnnqqW7Z///5u/Be/+EUhFi1fMnDgQDceLdNyxRVXFGK33XabW7bRsbRDZvDgwYVYlG3229/+1o2vWrWqEIsy07yMSklatGiRG1++fHkhFp2Tov7mLQHkLdEiSRs2bHDjUX97+eWX6y77ute9zo1PnTq1EOuK5R7oE9Xde++9btzLbO7Zs6dbduPGjW48yhz1MsWifhX1wzVr1hRiUZvr06ePG+/Ro4cb33333QuxSy65xC371a9+1Y03CpY7AQAAaCcMlgAAAEowWAIAACjBYAkAAKAEgyUAAIASO202nJf5Jfnr9URZOFGGgpk/wd7bzqc+9Sm3rJc5J0kzZsxw457evXu78SgjyFsHLsoajDKqGgWZP5m3vOUthdi8efPcslF2jpdtFmX4RNk5UabQs88+W4hFWZxR1udee+1V9za2bNnixiPeMYnqEWXgef2+K9ZcpE/EHnroITc+YcIEN+5l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UDYx8M46nxcf261uUja58mdKaUtNvPw939HRJ+pDn6BPbEWfyPZHn2hHltKOdse2QWUpm5cqpcldXBOgMdAngJboEw2rse4sAQAANBgGS51ntqRrurgOQCOZLfoEUGu26BMNia/hAAAASnBnCQAAoASDJQAAgBId9gveZtbQ3+/Z1l/6bKE9vpa89tpr3fjAgcWf11i6dKlbdsmSJW68Z8+ehdjBBx/slj3llFOiKrp23bX4I7fRcdqyZYsb93TksY6klPyddqFG7xO77OJ/dnr11eIyWbvvvrtb9vzzz3fjXtuS/HY0aNAgt+zGjf4P8PbrV/y9wdWrV7tl161b58affvppN/7II4+48e6IPtGxonY7blzr31nMvOENb3DjEydOLMTuv/9+t+yMGTPceP/+/QuxD33IXxIt6suXX365G589e7Yb746q9AnuLAEAAJRgsAQAAFCCwRIAAEAJBksAAAAlGCwBAACU6LBsuEbXHplYF110kRs/99xz3fjmzZsLsd12q/YWRJllnu9+97tu/CMf+Ygbf+WV/9/evcVGXa1vHF97G0BoalsKhZaCBTmEk0ZDQA7CBUqMGiMS8RQTg8Y7jdEbvTERudDEU/RCxZgYoiFAgkZBJRETjQoqSpHzuWBbKLSFAqUc/Jv/xb5cz7N2F3sKU/1+Lt+s/PqbmbVmVifrmff/su6lu/jh0+JSiHTi4sWLZX3fvn2y/t1338n6rFmzotp7770nx86cOVPWf/vtt6g2e/ZsObajo0PWXYpPpYrWr18vx/bt21fWL1y4IOvovRYsWBDVRowYIceqNGkIIWzbtk3WVbpz2bJlYqQeG0IIZ86ciWpqnYQQwssvvyzr8+fPl3X1ObFp0yY59scff5T13ohvlgAAABLYLAEAACSwWQIAAEhgswQAAJDwr546fFvsP2M/fPhwWX/++eej2iOPPCLHlpSUyPrmzZtlXbVrcD+Rr9qahBDCwIEDo9rOnTvl2LFjx8p6c3OzrC9fvjyqffDBB3Ksa9NSLP5prR16sqXMlClTotro0aPl2AMHDsh6S0uLrD/77LNRraamRo794YcfZF21a1i0aJEce/PNN8v6pEmTZF21iHABjmL3T1sTheDmxZw5c6Kae09sb2+Xddde6PDhw1HNBSdWrlwp66+++mpUq6+vl2OnTp0q6/3795d1dai8trZW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\n"
          },
          "metadata": {
            "needs_background": "light"
          }
        }
      ]
    },
    {
      "cell_type": "markdown",
      "source": [
        "From the look of some of these predictions, the model is getting about as confused as I would...\n",
        "\n",
        "For example it predicts \"Sneaker\" instead of \"Sandal\" when it could have easily been a \"Sneaker\".\n",
        "\n",
        "The same goes for the confusion between the classes of \"T-shirt/top\" and \"Shirt\", many of the examples here look similar."
      ],
      "metadata": {
        "id": "xoDfh-fKXtyU"
      }
    }
  ]
}
